Erzeugt eine pseudozufällige 6-stellige Zeichenfolge aus einer Ganzzahl

8

Ich versuche das folgende Problem über PHP zu lösen. Das Ziel besteht darin, eine eindeutige Zeichenfolge mit 6 Zeichen zu erzeugen, die auf einem ganzzahligen Seed basiert und einen vordefinierten Zeichenbereich enthält. Die zweite Voraussetzung ist, dass die Zeichenfolge zufällig erscheinen muss (wenn also Code 1 100000 war, ist es nicht akzeptabel, dass Code 2 100001 und 3 100002 ist)

Der Zeichenbereich ist:

  • Großbuchstaben A-Z mit Ausnahme von: B, I, O, S und Z
  • 0-9 ohne: 0, 1, 2, 5, 8

Das wären also insgesamt 26 Zeichen, wenn ich mich nicht irre. Meine erste Idee wäre, von Base 10 zu Base 24 zu kodieren, beginnend mit der Nummer 7962624. Also 7962624 + seed, und dann base24 codiert diese Nummer.

Das gibt mir die Zeichen 0-N. Wenn ich die resultierende Zeichenfolge auf die folgende Weise ersetze, erfülle ich dann das erste Kriterium:

%Vor%

An diesem Punkt werden meine Codes etwa so aussehen:

%Vor%

Meine Frage an Ihre Gurus lautet also: Wie kann ich eine Methode erstellen, die sich konsistent verhält (so dass die Rückgabezeichenfolge für eine gegebene Ganzzahl immer dieselbe ist) und die obigen 2 Anforderungen erfüllt? Ich habe jetzt zwei volle Tage damit verbracht, 700.000.000 Codes in eine Datenbank zu packen und sie nach dem Zufallsprinzip abzurufen. Ich habe keine Ideen mehr.

Stephen

    
Stephen Groom 03.10.2013, 14:15
quelle

1 Antwort

7

Sie erhalten eine einigermaßen zufällige Reihenfolge, wenn Sie Ihre Eingabesequenz 1,2,3 ... verwenden und eine lineare Map modulo eine Primzahl anwenden. Die Anzahl der eindeutigen Codes ist auf die Primzahl beschränkt, daher sollten Sie eine große wählen. Die resultierenden Codes sind einzigartig, solange Sie einen Multiplikator wählen, der nicht durch die Primzahl teilbar ist.

Hier ist ein Beispiel: Mit 6 Zeichen können Sie 26 6 = 308915776 eindeutige Strings bilden, so dass eine geeignete Primzahl 308915753 sein kann. Diese Funktion generiert daher über 300.000.000 eindeutige Codes:

%Vor%

Stellen Sie sicher, dass Sie dies auf 64bit PHP ausführen, andernfalls wird die Multiplikation überlaufen. Auf 32bit müssen Sie bcmath verwenden. Die für die Nummern 1 bis 9 generierten Codes sind:

%Vor%

Alles, was übrig bleibt, ist das Ausfüllen der ersten 0, die manchmal fehlen, und das Ersetzen der Buchstaben und Zahlen, so dass keine der verbotenen Zeichen erzeugt werden.

Wie Sie sehen, gibt es kein offensichtliches Muster, aber jemand, der etwas Zeit in der Hand hat, genug Motivation hat und Zugang zu einigen dieser Codes hat, wird herausfinden können, was vor sich geht. Eine sicherere Alternative ist die Verwendung eines Verschlüsselungsalgorithmus mit einer kleinen Blockgröße, z. B. Skip32 .

    
Joni 03.10.2013, 14:49
quelle

Tags und Links