2016-06-14 5 views
0

Ich habe eine users Tabelle und ich muss eine eindeutige, zufällig aussehende alphanumerische "ID" für jeden Benutzer erstellen (sie haben bereits automatisch inkrementierende IDs wie gewöhnlich). Diese Kennung muss:So generieren Sie zufällig aussehende eindeutige Bezeichner, die einem bestimmten Muster entsprechen

  • Seien Sie einzigartig
  • zufällig suchen
  • Spiel das Muster AAAA-1234 (4 Buchstaben, 4 Zahlen)

Gibt es einen besseren Weg, als zufällig Saiten erzeugen, zu halten, bis Ich finde einen, der noch nicht in der Datenbank ist?

+0

Wenn Sie "zufällig" sagen, meinen Sie, dass die Zahlen nicht folgerichtig sein sollten? –

+0

@PavelPetrov genau – nXu

+0

Möglicherweise ist der Algorithmus, den Sie benötigen, ähnlich wie das, das Kreditkartennummern generiert. Wahrscheinlich werden Sie eine bessere Antwort erhalten, wenn Sie diese Frage in Cryptography SE stellen. –

Antwort

2

Weisen Sie jedem Benutzer eine Ganzzahl in langweiliger Reihenfolge zu (oder verwenden Sie die andere von Ihnen erwähnte ID). Nennen Sie es $x.

Set $x = (($x + 2135587861) * 2654435769) & 0xffffffff.

Set $x = $x^($x >> 15).

$x = (($x + 2135587861) * 2654435769) & 0xffffffff erneut einstellen.

Berechnen Sie $x % 26 und wählen Sie einen Buchstaben a-z basierend auf dem Ergebnis. Set $x = $x/26. Wiederhole das vier Mal (ich kenne PHP nicht, also bekommst du hier mündliche Anweisungen).

Berechnen Sie $x % 10 und wählen Sie eine Ziffer 0-9 basierend auf dem Ergebnis. Set $x = $x/10. Wiederholen Sie vier Mal.

Erste sechs Ergebnisse, die wir bekommen sind:

HSQG-2102 
DNQO-1176 
TEKJ-5435 
EHWX-6540 
UPPH-0450 
MVIX-5036 

Es ist nicht gerade perfekt, aber es ist nicht offensichtlich. Vielleicht reicht das aus.

Es funktioniert auch nur für die ersten 4 Milliarden (ish) Benutzer, bevor Sie Kollisionen bekommen, aber das ist nur ein bisschen weit von der Grenze des String-Format sowieso.

+0

Ich verstehe die Zahlen hier nicht wirklich, aber wenn ich richtig sehe, bedeutet das im Grunde, dass jedes $ x genau einer Zeichenkette entspricht, die bis $ x <16^8 eindeutig ist, oder? – nXu

+1

Ja, sie sind bis zu diesem Limit einzigartig. Alle magischen Zahlen sind willkürlich und ich habe nur einige ausgewählt, die zu funktionieren schienen. Ich habe die ersten 64 Bits des Goldenen Schnitts benutzt. Die einzige Einschränkung ist, dass der Multiplikator ungerade sein muss - dies hat die mathematische Eigenschaft, dass jeder mögliche Eingang selbst nach '& 0xffffffff' einem eindeutigen Ausgang zugeordnet wird. Da alle Operationen die gleiche Eigenschaft haben, wissen wir, dass wir keine zwei Eingaben in dieselbe Ausgabe (Kollision) falten und dass wir die Operation theoretisch umkehren können, um die ursprüngliche Zahl zu entdecken. – sh1

+0

Danke für die Erklärung! – nXu

Verwandte Themen