Frage

Ich arbeite mit einem Client, Rubbelkarten, bottlecap Preisen in Magazin Millionen des alphanumerischen Codes verwendet erzeugen muss, und so weiter. Sie müssen sein, kurz genug, um auf einer Kappe zu drucken, wollen sie sicherstellen, dass mehrdeutige Zeichen wie 1 und I, 0 und O etc. sind nicht enthalten, und sie sind ausdrücklich für die zukünftige Verwendung gespeichert werden - wir können‘ t hat nur einen Algorithmus, die ‚Gültigkeit‘ bestimmt, wann jemand eine einzulösen versucht. Schließlich wollen sie sicherstellen, dass die Codes zufällig innerhalb eines großen „Coderaum“ verteilt sind, so dass die Menschen nicht nur zusätzliche Codes erraten kann durch das Alphabet zu Fuß.

Gibt es irgendwelche Hinweise auf einigermaßen effiziente Algorithmen für diese Art von Code-Generatoren? Ich habe ein paar heraus auf der Rückseite eines Umschlags zerkratzt, aber dieses Problem riecht wie eine Falle für die Unvorsichtigen.

War es hilfreich?

Lösung

Wenn Sie über 10 Millionen eindeutige Schlüssel benötigen (zum Beispiel), ist der beste Ansatz einen Schlüsselraum zu holen, die exponentiell größer, ist und starten Sie zufällig zu erzeugen. Lesen Sie über die Geburtstag Paradox - es ist die Hauptsache ist, sollten Sie besorgt sein. Wenn Sie 2 wollen ^ n eindeutige und sichere Schlüssel, stellen Sie sicher, dass es mindestens 2 ^ (2 * n) mögliche Werte. Hier ist eine grobe O-Algorithmus (n log n):

  • Verwenden Sie einen Schlüsselraum von mindestens 2 ^ 50 (so, mit anderen Worten, erlauben 2 ^ 50 mögliche eindeutige Werte), und Sie werden kaum in Ihrem gesamten Datensatz Kollisionen haben - und jemand Brute Ihre Schlüssel zwingen wird haben etwa auch Chancen, einen Schlüssel bekommen, wenn sie versuchen, 2 ^ 25 von ihnen.
  • erzeugen so viele Zufallszahlen, wie Sie benötigen
  • Index der Datenbank auf dem Schlüssel (dies ist die O (n lg n) Schritt: die Art)
  • Seite durch die DB und laufen die gesamten Daten über Set Duplikate trimmen (Pseudo-Code unten)
  • Löschen Sie die doppelten Zeilen, und Sie sind fertig.

Pseudocode:

$last = null;
while ($current = getnext()) {
    if ($last == $current) {
        push($toDelete, $current);
    }
    $last = $current;
}

Andere Tipps

Nehmen wir an, können Sie einen Zeichensatz verwenden, sagen wir, 40 Symbole der eindeutigen oberen, unteren und numerischen Zeichen.

Für eine Folge von n Zeichen, Sie haben 40 n Kombinationen

  • 40 4 = 2560000
  • 40 5 = 102400000
  • 40 6 = 4096000000
  • 40 7 = 163840000000
  • 40 8 = 6.553.600.000.000

So 8 Zeichen geben einen ziemlich guten Platz arbeiten - wenn Sie 10 Millionen Codes erzeugt, würden Sie Hunderte von Tausenden von Kombinationen, um zu versuchen, um Brute einen Code zu erzwingen.

Oder Sie kommen in der anderen Richtung - geben die Anzahl der möglich Codes, wie viele Codes sollte Sie erzeugen die Falle sie die Geburtstag Paradox ?

Unter dem 8 Zeichen-Code, 6.553.600.000.000 ist ca. 2 42 , so könnte man vernünftigerweise generieren 2 21 Codes von ihm oder 2.097.152

Verwenden Sie einen Einmal-Passwort-Algorithmus?

RFC4225 Details ein, basierend auf HMAC-Algorithmus.

http://www.ietf.org/rfc/rfc4226.txt

, sondern 0-9 Ziffern Base10-Codierung zu verwenden, verwenden base32.

Whatver Methode, die Sie verwenden, würde ich vorschlagen, dass Sie eine Prüfziffer oder zwei als „first-line“ Verteidigung gegen Menschen falsch Eingabe hinzufügen oder versuchen, eine Nummer zu erfinden.

Seltsamer, mit dem folgenden Samen ich nur in der Lage war, 32 eindeutige Zeichenfolgen zu erzeugen.

ABCDEFGHJKLMNPQRSTUVWXYZ23456789

Mit einem längeren Samen konnte ich viele generieren mehr -. Generierte 40.000 einzigartige Saiten erfolgreich

ABCDEFGHJKLMNPQRSTUVWXYZ234567892345678923456789ABCDEFGHJKLMNPQRSTUVWXYZ234567892345678923456789ABCDEFGHJKLMNPQRSTUVWXYZ234567892345678923456789

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top