Muszę generować unikalne numery identyfikacyjne w locie, używając javascript. W przeszłości robiłem to, tworząc liczbę za pomocą czasu. Liczba składałaby się z czterocyfrowego roku, dwucyfrowego miesiąca, dwucyfrowego dnia, dwucyfrowej godziny, dwucyfrowej minuty, dwucyfrowej sekundy i trzycyfrowej milisekundy. Więc wyglądałoby to mniej więcej tak: 20111104103912732 ... to dałoby wystarczającą pewność co do unikalnego numeru do moich celów.
Minęło trochę czasu, odkąd to zrobiłem i nie mam już kodu. Czy ktoś ma do tego kod lub ma lepszą sugestię dotyczącą wygenerowania unikalnego identyfikatora?
javascript
time
numbers
unique
Nick Petrie
źródło
źródło
new Date().toISOString ()
?Odpowiedzi:
Jeśli chcesz mieć tylko unikalny numer, to
przyniesie prosty numer. Ale jeśli potrzebujesz czytelnej wersji, czeka Cię trochę przetwarzania:
źródło
new Date().getTime();
date.getUTCMilliseconds()
date.getTime()
function foo1() {console.log(new Date().getUTCMilliseconds()); console.log(new Date().getUTCMilliseconds()); }
The value returned by getUTCMilliseconds() is an integer between 0 and 999.
. To najgorszy pomysł na unikalny identyfikator, należy usunąć pierwszy akapit.Lepszym podejściem byłoby:
zamiast
valueOf () jest „najprawdopodobniej” unikalną liczbą. http://www.w3schools.com/jsref/jsref_valueof_date.asp .
źródło
+new Date()
valueOf()
. Po prostu używam tego -+performance.now().toString().replace('.', 7)
developer.mozilla.org/en-US/docs/Web/API/Performance/nowNajkrótszym sposobem na utworzenie liczby, co do której możesz być pewien, że będzie wyjątkowa wśród tylu oddzielnych instancji, o ile możesz sobie wyobrazić, jest
Jeśli różnica w wywołaniu funkcji wynosi 1 milisekundę, generowanie innej liczby jest w 100% gwarantowane . W przypadku wywołań funkcji w ciągu tej samej milisekundy należy się martwić tylko wtedy, gdy tworzysz więcej niż kilka milionów liczb w tej samej milisekundzie, co jest mało prawdopodobne.
Więcej informacji na temat prawdopodobieństwa uzyskania powtarzającej się liczby w ciągu tej samej milisekundy można znaleźć na stronie https://stackoverflow.com/a/28220928/4617597
źródło
Można to osiągnąć po prostu za pomocą następującego kodu:
źródło
Oto, co robię, gdy chcę czegoś mniejszego niż kilka liczb - zmień bazę.
źródło
(Date.now() + Math.random()).toString(36)
aby zapobiec milisekundowym zderzeniom. Jest krótki i generuje coś takiego jak „k92g5pux.i36”Działa to szybciej niż tworzenie
Date
instancji, używa mniej kodu i zawsze generuje unikalny numer (lokalnie):jsfiddle: http://jsfiddle.net/j8aLocan/
Wydałem to na Bower i npm: https://github.com/stevenvachon/unique-number
Możesz również użyć czegoś bardziej wyszukanego, takiego jak cuid , puid lub shortid, aby wygenerować liczbę niebędącą liczbą.
źródło
używam
Więc jeśli przypadkiem kod zostanie uruchomiony w tym samym czasie, istnieje również malutka szansa, że losowe liczby będą takie same.
źródło
new Date()
jest przydatny.Math.random()
?To powinno wystarczyć:
źródło
jeśli chcesz mieć unikalny numer po kilku miliardach sekund, użyj
Date.now()
, jeśli chcesz go użyć wewnątrzfor loop
a, użyjDate.now() and Math.random()
razemunikalny numer wewnątrz pętli for
wyjście :: wszystkie liczby są unikalne
15598251485988384 155982514859810330 155982514859860737 155982514859882244 155982514859883316
unikalny numer bez
Math.random()
wyjście :: Liczby są powtarzane
1559825328327 1559825328327 1559825328327 1559825328328 1559825328328
źródło
Z badania w Internecie wymyśliłem następujący obiekt, który tworzy unikalny identyfikator na sesję:
To może być pomocne dla niektórych osób.
Twoje zdrowie
Andrzej
źródło
Powinno to również wystarczyć:
źródło
W ES6:
Przykład:
źródło
źródło
W 2020 r. Możesz użyć Crypto API w przeglądarce do generowania silnych kryptograficznie wartości losowych.
zarówno Uint8Array, jak i Crypto.getRandomValues są obsługiwane we wszystkich głównych przeglądarkach, w tym IE11
źródło
Publikuję tutaj ten fragment kodu do wykorzystania w przyszłości (bez gwarancji, ale wystarczający „unikalny”):
źródło
Tworzy to prawie gwarantowany unikalny klucz 32-znakowy po stronie klienta, jeśli chcesz, aby tylko liczby zmieniły zmienną "znaki".
https://jsfiddle.net/j0evrdf1/1/
źródło
użyj tego: do tworzenia unikalnego numeru w javascript
To naprawdę działa. :)
źródło
Połączenie 1: UniqueValue ('0')
Połączenie 2: UniqueValue (UniqueValue ('0')) // będzie złożone
Przykładowe wyniki:
dla (var i = 0; i <10; i ++) {console.log (UniqueValue (UniqueValue ( '0')))}
60950116113248802
26780116113248803
53920116113248803
35840116113248803
47430116113248803
41680116113248803
42980116113248804
34750116113248804
20950116113248804
03730116113248804
źródło
Ponieważ milisekundy nie są aktualizowane co milisekundę w węźle, następująca jest odpowiedź. W ten sposób generowany jest unikalny, czytelny dla człowieka numer biletu. Jestem nowy w programowaniu i nodejs. Proszę, popraw mnie jeśli się mylę.
}
}
źródło
Zakładając, że rozwiązanie zaproponowane przez @abarber to dobre rozwiązanie, ponieważ używa
(new Date()).getTime()
tak, że ma okienka milisekund i sumę atick
w przypadku kolizji w tym interwale, moglibyśmy rozważyć użycie wbudowanego, co wyraźnie widać tutaj w akcji:Po pierwsze, możemy zobaczyć, jak mogą wystąpić kolizje w ramie okna 1/1000 przy użyciu
(new Date()).getTime()
:Następnie wypróbowujemy proponowane rozwiązanie, które pozwala uniknąć kolizji w oknie 1/1000:
To powiedziawszy, moglibyśmy rozważyć użycie funkcji, takich jak węzeł,
process.nextTick
który jest wywoływany w pętli zdarzeń, jako pojedynczegotick
i jest to dobrze wyjaśnione tutaj . Oczywiście w przeglądarce nie ma,process.nextTick
więc musimy wymyślić, jak to zrobić. Ta realizacja będzie zainstalowaćnextTick
funkcję w przeglądarce przy użyciu najbardziej bliższych funkcje I / O w przeglądarce, które sąsetTimeout(fnc,0)
,setImmediate(fnc)
,window.requestAnimationFrame
. Jak sugerowano tutaj, możemy dodaćwindow.postMessage
, ale zostawiam to czytelnikowi, ponieważ potrzebujeaddEventListener
również. Zmodyfikowałem oryginalne wersje modułów, aby było to prostsze tutaj:Mamy więc w oknie 1/1000:
źródło
Może nawet lepiej byłoby użyć getTime () lub valueOf (), ale w ten sposób zwraca unikalną i zrozumiałą dla człowieka liczbę (reprezentującą datę i godzinę):
źródło
źródło
Łatwo i zawsze uzyskaj wyjątkową wartość:
źródło
Zrobiłem w ten sposób
źródło
źródło
w odniesieniu do powyższego rozwiązania #Marcelo Lazaroni
zwraca liczbę, taką jak ta 1567507511939.4558 (ograniczona do 4 miejsc po przecinku), i daje nieunikalne liczby (lub kolizje) co 0,1%.
dodanie metody toString () rozwiązuje ten problem
Date.now() + Math.random().toString()
zwraca „15675096840820.04510962122198503” (ciąg znaków) i jest dalej tak „powolny”, że i tak nigdy nie otrzymasz „tej samej” milisekundy.
źródło
źródło
Używając
toString(36)
, nieco powolnego, oto szybsze i unikalne rozwiązanie:źródło
Aby uzyskać unikalny numer:
Przykład:
możesz zmienić długość za pomocą:
źródło
proste rozwiązanie, które znalazłem
var dzisiaj = nowa data () .wartośćOf ();
console.log (dzisiaj);
źródło