2016-10-31 3 views
2

Was ist ein guter Algorithmus zum Generieren einer eindeutigen 64-Bit-ID ausgehend von mehreren numerischen 64-Bit-IDs? Beispiel:Erstellen Sie eine eindeutige numerische ID aus mehreren numerischen IDs

Input: [2, 9875, 0, 223.568, ...] eine Liste von zufälligem 64-Bit-IDs

Output: eine eindeutige 64-Bit numerische ID, die das sein muß Gleiches für den gegebenen Eingang

Ich suche einen Weg ID Kollision zu vermeiden.


Ich entschuldige mich für die unklare Frage.

+3

Bitte lesen Sie [this] (http://stackoverflow.com/help/how-to-ask), wie Sie Ihre Frage klären können. –

+2

Einige weitere Einschränkungen wären hilfreich. Wenn Sie zum Beispiel wissen, dass alle IDs maximal 10 Zeichen lang sind und es Ihnen egal ist, wie lang die resultierende ID ist, könnten Sie einfach verketten: 0000000002000000987500000000000000223568 –

+0

Wissen Sie etwas über die Verteilung der Werte Ihrer multiplen numerischen 64 -bit-IDs? – MrSmith42

Antwort

4

Wenn die Geschwindigkeit nicht egal, was ist:

alle IDs in der md5-Algorithmus Fütterung und als einfach

a) ersten 64 Bits oder
b) letzten 64 Bits verwenden oder
c) ersten 64 Bits xor letzten 64 Bits


Wenn die Geschwindigkeit ankommt

Was:

Schritt 1: die Bytes aller 64-Bit-IDs neu ordnen (in einem festen, aber unterschiedliche Reihenfolge für jeden 64-Bit-ID Ihren Eingang.) (Dies könnte ein wenig, wenn die hilft Werte sind nicht wirklich zufällig verteilt)

Schritt 2: xor alle neu angeordneten 64-Bit-IDs, um die neue 64-Bit-ID zu erhalten.


Wenn Sie keine zusätzlichen Informationen über die Reichweite des 64-Bit-Eingabe-IDs oder die Verteilung der Werte haben, gibt es keine Möglichkeit, Kollisionen in einem ‚klugen‘/‚besten‘ Weg zu vermeiden. Denn was auch immer Sie vorfinden, Sie werden immer eine Reihe von Eingängen finden, die zu Kollisionen führen.

0

This alte Frage wird für Sie nützlich sein, wenn Sie weitere Informationen wünschen, aber Sie können versuchen, diese:

java.util.UUID.randomUUID().hashCode() 

Wenn die vorherige Lösung nicht in Ihrem Fall nicht funktioniert, versuchen Sie dies:

private static final AtomicLong COUNTER = new AtomicLong(System.currentTimeMillis()*100000); 

Oder this Algorithmus (GitHub Link).

Verwandte Themen