2010-12-09 7 views
1

Ich versuche eine Liste von sich nicht wiederholenden alphanumerischen Codes zu erstellen. Sie werden in Stapeln und Mengen erzeugt, so dass es nicht möglich ist, explizit zu betrachten, was zuvor erzeugt wurde - d. H. Die Eindeutigkeit muss irgendwie garantiert werden, ohne dass auf frühere Codes außerhalb des aktuellen Stapels zurückgegriffen werden muss.Generieren einer sich nicht wiederholenden Liste von alphanumerischen Codes

Die Codes sollten eine Länge von 8 Zeichen mit der Einschränkung haben, dass bestimmte Zeichen nicht im Code erscheinen können (z. B. l und L), da ein Benutzer sie zu einem späteren Zeitpunkt erneut eingeben wird.

Ich werde dies wahrscheinlich in Java implementieren, aber ich würde jede Algorithmen oder Tricks zu schätzen wissen alle, denken Sie an diese für die Lösung kann ...

Grüße,

+1

Es gibt nur eine endliche Anzahl von 8-stelligen Kombinationen - eindeutig hätten sie * nach einer Weile wiederholen müssen. – casablanca

+1

Siehe http://stackoverflow.com/tags/license-key/faq –

+0

Können Sie uns die vollständige Liste der erlaubten leters geben? Ich nehme an, dass 'o' und 'O' ebenfalls nicht erlaubt sind. –

Antwort

4

nehmen System.currentTimeMillis einfach und kodieren alphanumerisch, indem jede Ziffer auf einen Buchstaben abgebildet wird. Behalten Sie den letzten ausgegeben (um mehrere Generationen in der gleichen Millisekunde zu schützen) und behandeln Sie entsprechend.

2

Das Problem, wie gesagt, hat die naheliegende Lösung, die Codes sequentiell beginnend bei Null zu generieren. Stellen Sie sich jeden Code als eine Zahl in Base-34 vor (die Ziffern sind 0-9 und A-Z außer I und L). Wenn dies nicht das ist, was Sie wollen, können Sie die Frage klären (zB wollen Sie Zufälligkeit?)

bearbeiten: Dies erfordert natürlich, dass Sie sich an den letzten Code erinnern, den Sie generiert haben, und tragen Sie diese eine Information über Chargen hinweg.

3

Sie könnten nur eine atomare Zähler wie

AtomicInteger counter = new AtomicInteger(); 

public String generateId() { 
    return Integer.toHexString(counter.getAndIncrement()); 
} 

kodieren Dieses Sie geben 4 Milliarden eindeutige IDs.

Wenn Sie mehr als 4 Milliarden benötigen, können Sie eine AtomicLong verwenden und verwenden Sie Ihre eigene Codierung für diese Zahl abhängig davon, welche Zeichen Sie zulassen möchten.

0

8 verschachtelten Schleifen lösen Ihr Problem trivial. Darüber hinaus können Sie mit Random das nächste Token generieren und alle Token in Set speichern. Jedes Mal, wenn Sie ein neues Token erhalten, prüfen Sie, ob es bereits gesetzt ist.

+0

Ich denke,' Random' berücksichtigt nicht * Eindeutigkeit muss irgendwie garantiert werden ohne Rückgriff auf vorherige Codes außerhalb des aktuellen Stapels * –

+0

Gegeben 34 Symbole für ein Codezeichen, Wahrscheinlichkeit von doppelten Codes bei der zufälligen Generierung von Codes ist etwa 10^-13, - ziemlich klein. –

0

Schade, Sie sind auf 8 Zeichen beschränkt. Andernfalls hätten Sie die MD5-Klasse verwenden können, um eindeutige Codes zu generieren.

Wenn Sie sicherstellen möchten, dass Ihre Codes eindeutig sind, können Sie das Generierungsdatum in einige Ihrer Codezeichen codieren, um sicherzustellen, dass es nicht mit früheren Codes in Konflikt gerät.

Zum Beispiel Ihr Code die Form YMDXXXXX haben würde, wobei gilt:

  • Y das Jahr seit 2010 (Beginn mit 0, und starten Sie Buchstaben verwenden, wenn Sie aus Zahlen im Jahr 2020 laufen)
  • M ist der Monat (gleiche Kriterien)
  • D ist der Tag (wird nicht als 31 größer sein, so chars 0-9A-Z genug sein sollte)
  • X die Codes erzeugt auf Ihrem aktuellen Stapel sind.
0

Können Sie so vorwärts iterieren?

000000a1 000000a2 000000a3 ... 000000ay 000000az 000000b0

Dann denken Sie daran, die letzte Nummer und alle zukünftigen Zahlen größer sein wird als die letzte

Sie diese nützliche

finden
long l = 20492; 
String s = "wogjz"; 
s = Long.toString(l, 26+10-2).replace('I','Y').replace('L','Z') // convert long number to string (with letters) 
l = Long.parseLong(s.replace('Y','I').replace('Z','L'), 26+10-2) + 1) // Convert string to number 

Die Zahl 26 + 10-2 ist die Anzahl der Buchstaben plus die Anzahl der Buchstaben Ziffern minus Anzahl der verbotenen Buchstaben (I und L). Bei der I/Y- und Z/L-Konvertierung werden in Zusammenarbeit mit der Java-Bibliothek die letzten Buchstaben des Alphabets verwendet.

Sie möchten sicherstellen, dass der Benutzer I oder L nicht selbst eingibt, weil sonst mein Code nicht richtig funktioniert.

Sie wollen führende Nullen auf die Zeichenfolge hinzuzufügen, bis es 8 Zeichen

auch erreicht mein Programm kennt nicht den Unterschied zwischen großen und kleinen Buchstaben. Wenn Sie das brauchen, dann müsste die App komplexer sein, weil wir ein Array anstatt nur einer langen Zahl benötigen würden.

Verwandte Themen