Ich muss im Handumdrehen eindeutige ID-Nummern mit Javascript generieren. In der Vergangenheit habe ich dazu eine Zahl mit der Zeit erstellt. Die Zahl würde sich aus dem vierstelligen Jahr, dem zweistelligen Monat, dem zweistelligen Tag, der zweistelligen Stunde, der zweistelligen Minute, der zweistelligen Sekunde und der dreistelligen Millisekunde zusammensetzen. Es würde also ungefähr so aussehen: 20111104103912732 ... dies würde genug Sicherheit für eine eindeutige Nummer für meine Zwecke geben.
Es ist schon eine Weile her, seit ich das getan habe und ich habe den Code nicht mehr. Hat jemand den Code dafür oder einen besseren Vorschlag zum Generieren einer eindeutigen ID?
javascript
time
numbers
unique
Nick Petrie
quelle
quelle
new Date().toISOString ()
?Antworten:
Wenn Sie nur eine eindeutige Nummer möchten, dann
würde dir eine einfache Nummer geben. Wenn Sie jedoch die lesbare Version benötigen, müssen Sie einige Schritte ausführen:
quelle
new Date().getTime();
diedate.getUTCMilliseconds()
Rückgabe einer Zahl zwischen 0 und 999 sein.date.getTime()
Gibt seit dem 1. Januar 1970 Millisekunden zurück. (normaler Zeitstempel). w3schools.com/jsref/jsref_obj_date.aspfunction foo1() {console.log(new Date().getUTCMilliseconds()); console.log(new Date().getUTCMilliseconds()); }
The value returned by getUTCMilliseconds() is an integer between 0 and 999.
. Dies ist die schlechteste Idee für eine eindeutige ID. Der erste Absatz sollte entfernt werden.Ein besserer Ansatz wäre:
anstatt
valueOf () ist "höchstwahrscheinlich" eine eindeutige Zahl. http://www.w3schools.com/jsref/jsref_valueof_date.asp .
quelle
+new Date()
valueOf()
. Ich benutze dies einfach -+performance.now().toString().replace('.', 7)
developer.mozilla.org/en-US/docs/Web/API/Performance/nowDer kürzeste Weg, um eine Zahl zu erstellen, von der Sie ziemlich sicher sein können, ist unter so vielen verschiedenen Instanzen, wie Sie sich vorstellen können, eindeutig
Wenn der Funktionsaufruf einen Unterschied von 1 Millisekunde aufweist, wird zu 100% garantiert, dass eine andere Nummer generiert wird . Bei Funktionsaufrufen innerhalb derselben Millisekunde sollten Sie sich nur dann Sorgen machen, wenn Sie innerhalb derselben Millisekunde mehr als einige Millionen Nummern erstellen, was nicht sehr wahrscheinlich ist.
Weitere Informationen zur Wahrscheinlichkeit, innerhalb einer Millisekunde eine wiederholte Nummer zu erhalten, finden Sie unter https://stackoverflow.com/a/28220928/4617597
quelle
Dies kann einfach mit dem folgenden Code erreicht werden:
quelle
Folgendes mache ich, wenn ich etwas kleineres als ein paar Zahlen möchte - Basis ändern.
quelle
(Date.now() + Math.random()).toString(36)
, um Millisekunden-Zusammenstöße zu vermeiden. Es ist kurz und erzeugt so etwas wie "k92g5pux.i36"Dies ist schneller als das Erstellen einer
Date
Instanz, verwendet weniger Code und erzeugt immer eine eindeutige Nummer (lokal):jsfiddle: http://jsfiddle.net/j8aLocan/
Ich habe dies auf Bower und npm veröffentlicht: https://github.com/stevenvachon/unique-number
Sie können auch etwas Ausgefeilteres wie cuid , puid oder shortid verwenden , um eine Nicht-Zahl zu generieren.
quelle
ich benutze
Wenn also zufällig der Code zur gleichen Zeit ausgelöst wird, besteht auch eine winzige Chance, dass die Zufallszahlen gleich sind.
quelle
new Date()
ist nützlich hart. Sie könnten die gleichen Zahlen mit zwei verschiedenen Daten erhaltenMath.random()
?Dies sollte tun:
quelle
Wenn Sie nach einigen Millisekunden eine eindeutige Nummer
Date.now()
wünschen, verwenden Sie, wenn Sie sie innerhalb vonfor loop
verwenden möchten, verwenden Sie sieDate.now() and Math.random()
zusammeneindeutige Nummer innerhalb einer for-Schleife
output :: alle Zahlen sind eindeutig
15598251485988384 155982514859810330 155982514859860737 155982514859882244 155982514859883316
eindeutige Nummer ohne
Math.random()
output :: Numbers werden wiederholt
1559825328327 1559825328327 1559825328327 1559825328328 1559825328328
quelle
Bei der Online-Untersuchung habe ich das folgende Objekt gefunden, das pro Sitzung eine eindeutige ID erstellt:
Es ist vielleicht hilfreich für einige Leute.
Prost
Andrew
quelle
Dies sollte auch tun:
quelle
In ES6:
Beispiel:
quelle
quelle
Im Jahr 2020 können Sie die Crypto-API im Browser verwenden , um kryptografisch starke Zufallswerte zu generieren.
Sowohl Uint8Array als auch Crypto.getRandomValues werden in allen gängigen Browsern, einschließlich IE11, unterstützt
quelle
Posten Sie dieses Code-Snippet hier als meine eigene zukünftige Referenz (nicht garantiert, aber zufriedenstellend "einzigartig" genug):
quelle
Dies schafft eine fast garantierte eindeutige Client-Seite mit 32 Zeichen, wenn Sie nur Zahlen möchten, ändern Sie die "Zeichen" -Vari.
https://jsfiddle.net/j0evrdf1/1/
quelle
Verwenden Sie dies: zum Erstellen einer eindeutigen Nummer in Javascript
Es funktioniert wirklich. :) :)
quelle
Aufruf 1: UniqueValue ('0')
Aufruf 2: UniqueValue (UniqueValue ('0')) // ist komplex
Beispielausgabe:
for (var i = 0; i <10; i ++) {console.log (UniqueValue (UniqueValue ( '0')));}
60950116113248802
26780116113248803
53920116113248803
35840116113248803
47430116113248803
41680116113248803
42980116113248804
34750116113248804
20950116113248804
03730116113248804
quelle
Da Millisekunden nicht jede Millisekunde im Knoten aktualisiert werden, folgt eine Antwort. Dies erzeugt eine eindeutige, von Menschen lesbare Ticketnummer. Ich bin neu in Programmierung und NodeJS. Bitte korrigieren Sie mich, wenn ich falsch liege.
}}
}}
quelle
Angenommen, die von @abarber vorgeschlagene Lösung ist eine gute Lösung, da sie verwendet wird,
(new Date()).getTime()
sodass sie ein Fenster von Millisekunden hat undtick
bei Kollisionen in diesem Intervall a summiert. Wir könnten in Betracht ziehen, die integrierte Lösung zu verwenden, wie wir hier in Aktion deutlich sehen können:Zunächst können wir hier sehen, wie es zu Kollisionen im 1/1000 Fensterrahmen kommen kann, indem wir
(new Date()).getTime()
:Zweitens versuchen wir die vorgeschlagene Lösung, die Kollisionen im 1/1000 Fenster vermeidet:
Das heißt, wir könnten in Betracht ziehen, Funktionen wie den Knoten
process.nextTick
, der in der Ereignisschleife aufgerufen wird, als einzelne zu verwenden,tick
und dies wird hier gut erklärt . Natürlich gibt es im Browser keine,process.nextTick
also müssen wir herausfinden, wie das geht. Diese Implementierung wird eine Installation vonnextTick
Funktion im Browser mit den meisten näheren Funktionen an das I / O in dem Browser, sindsetTimeout(fnc,0)
,setImmediate(fnc)
,window.requestAnimationFrame
. Wie hier vorgeschlagen , könnten wir das hinzufügenwindow.postMessage
, aber ich überlasse dies dem Leser, da es auch ein benötigtaddEventListener
. Ich habe die ursprünglichen Modulversionen geändert, um es hier einfacher zu halten:Also haben wir im 1/1000 Fenster:
quelle
Vielleicht wäre es sogar noch besser, getTime () oder valueOf () zu verwenden, aber auf diese Weise wird eine eindeutige plus vom Menschen verständliche Zahl (die Datum und Uhrzeit darstellt) zurückgegeben:
quelle
quelle
Einfach und immer einzigartig:
quelle
Ich habe es so gemacht
quelle
quelle
in Bezug auf die # Marcelo Lazaroni-Lösung oben
Gibt eine Zahl wie diese 1567507511939.4558 (auf 4 Dezimalstellen begrenzt) zurück und gibt alle 0,1% nicht eindeutige Zahlen (oder Kollisionen) an.
Durch Hinzufügen von toString () wird dies behoben
Date.now() + Math.random().toString()
gibt '15675096840820.04510962122198503' (eine Zeichenfolge) zurück und ist außerdem so 'langsam', dass Sie sowieso nie die 'gleiche' Millisekunde erhalten.
quelle
quelle
Mit
toString(36)
, etwas langsam, ist hier die schnellere und einzigartige Lösung:quelle
So erhalten Sie eine eindeutige Nummer:
Beispiel:
Sie können die Länge ändern mit:
quelle
100% garantiert eine andere Anzahl zu generieren ...
quelle