2016-06-13 2 views
0

Ich brauche eine Zufallszahl, die ich in der Datenbank pro Datensatz speichern werde und die (generierte Zufallszahl) soll sich auch in Zukunft nicht wiederholen. Ist die Funktion Math.random() dafür geeignet?Generiert Javascript's Math.random() eine eindeutige Nummer, die sich in Zukunft nicht wiederholen wird?

Vielen Dank im Voraus

+0

http://stackoverflow.com/questions/8012002/create-a-unique-number-with-javascript-time –

+0

Es ist eine Zufallszahl ohne Versprechen der Eindeutigkeit. Das heißt, es wird aus einer Obermenge von 2^53 Werten gewählt, es kann eine Zahl nicht so einfach wiederholen. – gurvinder372

+0

Wie James Donnely hinzugefügt: new Date(). ValueOf() + math.random() garantiert keine Eindeutigkeit, aber macht es ziemlich schwer, wiederholt zu werden – Borjante

Antwort

2

Sie können für Ihre DB hier für GUID-Generator für eindeutige Schlüssel sehen. Auch dort können Sie eine Menge guter Informationen über Zufallsmechanismen

Create GUID/UUID in JavaScript?

+0

Link-Only-Antworten sind nicht wirklich gut SO passt, und wenn Sie zu einer SO-Antwort verknüpfen, sollten Sie die Frage als ein Betrüger markieren. –

+0

Es ist nicht dupe, weil Hauptfrage nicht direkt über GUID oder solche anderen Dinge ist. Aber meine Antwort kann einen anderen Weg zeigen, TS-Frage zu lösen und kann viele relevante Informationen für ihn und andere Leser bringen. – Vitalii

+0

Es ist ein X-Y-Problem. Selbst wenn dies nicht der Fall wäre, sind Link-Only-Antworten immer noch nicht in Ordnung. –

1

Zufall ist zufällig finden und statistisch wird es irgendwo in der Zukunft wiederholen. Was Sie tun können, ist, etwas Einzigartiges mit einem zufälligen Teil zu kombinieren - verwenden Sie zum Beispiel den Unix-Zeitstempel mit einer Zufallszahl.

function getRand(){ 
    return new Date().getTime().toString() + Math.floor(Math.random()*1000000); 
} 
+0

Nun, * statistisch * wahrscheinlich * wird * nicht wiederholen, aber offensichtlich ist das nicht gut genug für eine UID. –

+0

@DaveNewton * irgendwo in der Zukunft * ..Ich denke, dass jede Wahrscheinlichkeit ungleich null auf einer unendlichen Zeitskala zu 100% konvergiert (oder einfach 100% ist, wenn wir Limits verwenden). Der Punkt war, dass es unsicher ist, nur eine Zufallszahl zu verwenden, um eine UID zu generieren. Durch die Kombination mit dem Unix-Zeitstempel wird die Wahrscheinlichkeit, dass eine doppelte ID generiert wird, deutlich reduziert. Sie müsste gleichzeitig generiert werden und die gleiche angehängte Zufallszahl erzeugen. – Dropout

+0

Mein Punkt war, dass es wahrscheinlich nicht zu wiederholen ist des OP-Systems, und ich habe ausdrücklich darauf hingewiesen, dass es kein ausreichender Prozess für die Erzeugung von uid war. Es gibt keine unendliche Zeitskala in einem echten System - aber ich stimme zu, dass es nicht zufällig geschehen sollte. –

3

Math.random() wird nicht geben Sie eine eindeutige Nummer, in der Regel wird es Ihnen nicht einmal eine echte Zufallszahl geben.

Sie können versuchen, einen Datetime-basierten Zufallsalgorithmus zu verwenden, oder nach einer Zufallszahl suchen und dann prüfen, ob sie bereits in Ihrer Datenbank vorhanden ist, aber beide Ansätze sind nicht 100% sicher. Es gibt so gut wie nur eine Möglichkeit, um sicherzustellen, dass die gespeicherte Nummer einzigartig ist, nämlich auf Datenbankebene.

1

Zeit + Zuwachs + random:

var newGuid = (function() { 
    var guid = parseInt(Math.random() * 36); 
    return function newGuid() { 
     return Date.now().toString(36) + (guid++ % 36).toString(36) + Math.random().toString(36).slice(2, 4); 
    }; 
    })(); 
0

Wenn Sie auf die Spezifikationen von math.random schauen, sehen Sie, dass als Quasi-Zufallszahlengenerator, Bedeutung definiert ist, ist es nicht wirklich zufällig ist. Darüber hinaus wird ein echter Zufallszahlengenerator sicherlich ein Ergebnis irgendwo entlang der Linie wiederholen, ABER, wenn dies geschieht, wird die Reihe, die dieser Wiederholung folgt, nicht der Reihe nach dem ersten Erscheinen der Zahl ähneln.

Nun haben Sie erwähnt, dass Sie dies in einer Datenbank speichern müssen. Warum verwenden Sie keine SEQUENCE (in Oracle; andere DBMS haben unterschiedliche Mechanismen dafür)? Dies garantiert, dass jede verwendete Nummer NIE wiederverwendet wird. Wenn Sie keine Zahlen in einer Sequenz verwenden möchten, können Sie außerdem den Wert dieser Sequenz als Startwert für eine Zufallszahl (oder ein Hashing) verwenden. Dies gibt Ihnen die Einzigartigkeit vieler Ziffern.

Verwandte Themen