Generierung eines eindeutigen 6-stelligen Codes

7

Ich erzeuge einen sechsstelligen Code aus den folgenden Zeichen. Diese werden verwendet, um Aufkleber zu stempeln.
Sie werden in Chargen von 10k oder weniger (vor dem Druck) erzeugt und ich sehe nicht voraus, dass es jemals mehr als 1-2 Millionen (wahrscheinlich viel weniger) geben wird.
Nachdem ich die Codesätze generiert habe, überprüfe ich die MySQL-Datenbank der bestehenden Codes, um sicherzustellen, dass es keine Duplikate gibt.

%Vor%
  1. Ist das ein solider Ansatz, um den Code zu generieren?
  2. Wie viele mögliche Permutationen würde es geben? (6-stelliger Code aus einem Pool von 21 Zeichen). Tut mir leid, Mathe ist nicht meine Stärke
Quad6 09.05.2013, 23:31
quelle

6 Antworten

11

21 ^ 6 = 85766121 Möglichkeiten.

Es ist schlecht, einen DB zu verwenden und verwendete Werte zu speichern. Wenn Sie Zufälligkeiten fälschen möchten, können Sie Folgendes verwenden:

Reduzieren Sie auf 19 mögliche Zahlen und nutzen Sie die Tatsache, dass Gruppen der Ordnung p ^ k, wobei p eine ungerade Primzahl ist, immer zyklisch sind.

Nimm die Gruppe der Ordnung 7 ^ 19, benutze einen Generator Co-Primzahl zu 7 ^ 19 (Ich wähle 13 ^ 11, du kannst alles wählen, was nicht durch 7 teilbar ist).

Dann funktioniert das Folgende:

%Vor%

Es durchläuft alle möglichen Werte und sieht ein wenig zufällig aus, wenn sie nicht graben. Eine noch sicherere Alternative wären multiplikative Gruppen, aber ich habe meine Mathematik bereits vergessen: (

    
Jean-Bernard Pellerin 09.05.2013, 23:36
quelle
7
  • Es gibt viele mögliche Kombinationen mit oder ohne Wiederholungen, also wäre Ihre Logik ausreichend
  • Kollision ist häufig, weil Sie rand verwenden. Siehe str_shuffle und Zufälligkeit .
  • Ändern rand in mt_rand
  • Verwenden Sie einen schnellen Speicher wie memcached oder redis nicht MySQL, wenn Sie
  • überprüfen

Gesamtmöglichkeit

%Vor%

85,766,121 sollte in Ordnung sein. Um eine Datenbank zu dieser Generation hinzuzufügen, versuchen Sie:

Beispiel

%Vor%

Funktion verwendet

%Vor%     
Baba 09.05.2013 23:39
quelle
3

Wie Baba sagte, wird das Erzeugen einer Schnur während der Fahrt zu Tonnen von Kollisionen führen. Je näher Sie 80 Millionen bereits generierten kommen, desto schwieriger wird es, eine verfügbare Zeichenfolge zu erhalten

Eine andere Lösung könnte sein, alle möglichen Kombinationen einmal zu erzeugen und sie alle bereits in der Datenbank zu speichern, mit einem booleschen Spaltenfeld, das angibt, ob eine Zeile / ein Token bereits verwendet wird oder nicht

dann um einen von ihnen zu bekommen

%Vor%

und markieren Sie es dann als bereits verwendet

%Vor%     
user652649 10.05.2013 00:10
quelle
3

Sie hätten 21 ^ 6 Codes = 85 766 121 ~ 85,8 Millionen Codes!

Um sie alle zu generieren (was einige Zeit dauern würde), sehen Sie sich die ausgewählte Antwort auf diese Frage an: Algorithmus, der Zahlen oder Wörter nimmt und alle möglichen Kombinationen findet .

    
silkfire 09.05.2013 23:36
quelle
0

Ich hatte das gleiche Problem, und ich fand eine sehr beeindruckende Open-Source-Lösung:

Ссылка

Sie können es nehmen und benutzen, es lohnt sich auch, im Quellcode nachzusehen, was unter der Haube passiert.

    
Tamás Pap 15.06.2013 22:54
quelle
-1

Oder ... Sie können Benutzername + Datum in md5 kodieren und in der Datenbank speichern, das wird sicher einen eindeutigen Code erzeugen;)

    
Ionut Ionete 01.06.2015 07:44
quelle

Tags und Links