Javascript generieren eindeutige Nummer, basierend auf string
Können sagen, ich habe einen string var input = "Foo"
und ich brauche eine 100% eindeutige Zahl aus diesem string habe ich versucht, etwas wie
for (var i = 0, len = input.length; i < len; i++) {
output += input[i].charCodeAt(0)
}
Aber dies erzeugt Duplikate wie W8M
und YSM
und beide geben die id des 149
.
Gibt es einen Algorithmus, der für so etwas?
- Was tun, verwenden Sie die eindeutige Nummer?
- Ist das nicht im Grunde das, was eine "perfekte" Hash-Algorithmus tun würde?
- Kryptographie
- Diese ALSO Antwort die Ihnen helfen könnten. Es ist eine Frage über Java, aber die Ideen und das code-Beispiel sollte zeigen Sie in die richtige Richtung.
- Wenn Sie möchten, dass keine Kollisionen im all ("100% unique number"), dann ist eine hash-Funktion ist nicht, was Sie suchen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Möchten Sie eine hash-Funktion. Hash-Funktionen sind im Allgemeinen nicht eindeutig ist (wie in, gibt es Kollisionen), aber der Schlüsselraum ist so groß, dass Sie vielleicht Leben ganze Leben, ohne einen zu finden, der in Ihrer app.
Blick für die SHA1-und SHA256-Implementierungen für JavaScript für einen start, wenn Sie mit den Knoten, Blick auf die crypto-Modul.
Wie wäre es damit:
Meine Geige zeigt unterschiedliche Ergebnisse für
W8N
undYSM
. Ich habe es mit der gleichen Logik, wie Sie. Sehen Sie:https://jsfiddle.net/3fqsvkqw/4/
let input = "W5M";
während mein input warW8N
@netoguimaraes",,,"
und"ƼƼ"
und"제"
und"ᅜ,"
- Sie alle geben eine Leistung von444444
.Hier ist eine einfache
hash
Funktion fürjs
strings.JS:
SHA1
wie große algorithmen?Wenn Ihr Ziel ist zu schaffen eine eindeutige Nummer, die zum Zeitpunkt der string erstellt wird, die dann verwendet werden können, verweisen Sie die Zeichenfolge, dann hier ist ein one-liner in eine Prise:
JS:
Dies schafft ein genauer Zeitstempel als Datum-Schnittstelle, und wenn Sie entfernen das Komma wird es eine sehr einzigartige Nummer. Ich hatte noch nie eine Kollision, bei meinen persönlichen Projekten, wahrscheinlich, weil "im Gegensatz zu
Date.now()
, die Werte, die vonperformance.now()
immer zu erhöhen bei einer Konstanten Geschwindigkeit, unabhängig von der system clock" (Quelle). Allerdings, wenn Sie immer noch paranoid ist, kann man etwas erreichen, noch mehr quasi-einzigartigen von etwas wie dies:JS:
Oder so:
JS:
Wenn Sie die eindeutige Nummer, immer die gleiche Länge haben, dann können Sie so etwas tun, das sicherstellt, dass der Ausgang enthält immer 16 Ziffern:
JS:
Alle der oben genannten sind ausgegeben wie strings. Wenn Sie einen numerischen, dann umwandeln in eine Zahl: