Saya perlu membuat nomor id unik dengan cepat menggunakan javascript. Di masa lalu, saya telah melakukan ini dengan membuat angka menggunakan waktu. Angka tersebut akan terdiri dari empat digit tahun, dua digit bulan, dua digit hari, dua digit jam, dua digit menit, dua digit detik, dan tiga digit milidetik. Jadi akan terlihat seperti ini: 20111104103912732 ... ini akan memberikan kepastian yang cukup tentang nomor unik untuk tujuan saya.
Sudah lama sejak saya melakukan ini dan saya tidak memiliki kode lagi. Ada yang punya kode untuk melakukan ini, atau punya saran yang lebih baik untuk menghasilkan ID unik?
javascript
time
numbers
unique
Nick Petrie
sumber
sumber
new Date().toISOString ()
?Jawaban:
Jika Anda hanya ingin nomor unik, maka
akan memberi Anda nomor sederhana. Tetapi jika Anda membutuhkan versi yang dapat dibaca, Anda sedang dalam proses:
sumber
new Date().getTime();
yangdate.getUTCMilliseconds()
kembali angka antara 0 dan 999.date.getTime()
kembali milidetik sejak 1 Jan 1970. (timestamp normal). 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.
. Ini adalah ide terburuk untuk id unik, paragraf pertama harus dihapus.Pendekatan yang lebih baik adalah:
dari pada
valueOf () "kemungkinan besar" adalah nomor unik. http://www.w3schools.com/jsref/jsref_valueof_date.asp .
sumber
+new Date()
valueOf()
. Saya hanya menggunakan ini -+performance.now().toString().replace('.', 7)
developer.mozilla.org/en-US/docs/Web/API/Performance/nowCara terpendek untuk membuat nomor yang Anda yakin akan unik di antara banyak contoh terpisah yang dapat Anda pikirkan adalah
Jika ada perbedaan 1 milidetik dalam pemanggilan fungsi, dijamin 100% akan menghasilkan nomor yang berbeda . Untuk pemanggilan fungsi dalam milidetik yang sama, Anda seharusnya hanya mulai khawatir jika Anda membuat lebih dari beberapa juta nomor dalam milidetik yang sama, yang sangat tidak mungkin.
Untuk informasi lebih lanjut tentang kemungkinan mendapatkan nomor berulang dalam milidetik yang sama lihat https://stackoverflow.com/a/28220928/4617597
sumber
Ini dapat dicapai hanya dengan kode berikut:
sumber
Inilah yang saya lakukan ketika saya menginginkan sesuatu yang lebih kecil dari sekumpulan angka - ubah basis.
sumber
(Date.now() + Math.random()).toString(36)
untuk mencegah bentrokan milidetik. Ini pendek dan menghasilkan sesuatu seperti "k92g5pux.i36"Ini bekerja lebih cepat daripada membuat
Date
instance, menggunakan lebih sedikit kode dan akan selalu menghasilkan nomor unik (secara lokal):jsfiddle: http://jsfiddle.net/j8aLocan/
Saya telah merilis ini di Bower dan npm: https://github.com/stevenvachon/unique-number
Anda juga bisa menggunakan sesuatu yang lebih rumit seperti cuid , puid atau shortid untuk menghasilkan non-number.
sumber
saya menggunakan
Jadi, jika kebetulan kode tersebut diaktifkan pada saat yang sama, ada kemungkinan kecil bahwa nomor acaknya akan sama.
sumber
new Date()
tangguh berguna. Anda bisa mendapatkan nomor yang sama dengan dua tanggal berbedaMath.random()
?Ini harus dilakukan:
sumber
Jika Anda menginginkan nomor unik setelah beberapa mili detik maka gunakan
Date.now()
, jika Anda ingin menggunakannya di dalam afor loop
maka gunakanDate.now() and Math.random()
bersamanomor unik di dalam for loop
keluaran :: semua nomor unik
15598251485988384 155982514859810330 155982514859860737 155982514859882244 155982514859883316
nomor unik tanpa
Math.random()
output :: Angka diulang
1559825328327 1559825328327 1559825328327 1559825328328 1559825328328
sumber
Dari penyelidikan online saya menemukan objek berikut yang membuat id unik per sesi:
Ini mungkin membantu bagi sebagian orang.
Bersulang
Andrew
sumber
Ini juga harus dilakukan:
sumber
Di ES6:
Contoh:
sumber
sumber
Pada tahun 2020, Anda dapat menggunakan Crypto API dalam browser untuk menghasilkan nilai acak yang kuat secara kriptografis.
baik Uint8Array dan Crypto.getRandomValues didukung di semua browser utama, termasuk IE11
sumber
Memposting potongan kode ini di sini untuk referensi saya di masa mendatang (tidak dijamin, tetapi cukup "unik" yang memuaskan):
sumber
Ini menciptakan sisi klien kunci unik 32 karakter yang hampir dijamin, jika Anda hanya ingin angka mengubah var "chars".
https://jsfiddle.net/j0evrdf1/1/
sumber
gunakan ini: untuk membuat nomor unik di javascript
Ini benar-benar berhasil. :)
sumber
Panggilan 1: UniqueValue ('0')
Call 2: UniqueValue (UniqueValue ('0')) // akan menjadi kompleks
Contoh Keluaran:
for (var i = 0; i <10; i ++) {console.log (UniqueValue (UniqueValue ('0')));}
60950116113248802
26780116113248803
53920116113248803
35840116113248803
47430116113248803
41680116113248803
53920116113248803
35840116113248803
47430116113248803
41680116113248803
sumber
Karena milidetik tidak diperbarui setiap milidetik dalam node, berikut adalah jawabannya. Ini menghasilkan nomor tiket unik yang dapat dibaca manusia. Saya baru mengenal pemrograman dan nodejs. Tolong koreksi saya jika saya salah.
}
}
sumber
Diasumsikan bahwa solusi yang diusulkan oleh @abarber itu adalah solusi yang baik karena menggunakan
(new Date()).getTime()
sehingga memiliki jendela milidetik dan jumlah atick
jika terjadi tabrakan dalam interval ini, kami dapat mempertimbangkan untuk menggunakan bawaan seperti yang dapat kita lihat dengan jelas di sini beraksi:Pertama, kita dapat melihat di sini bagaimana bisa terjadi tabrakan di bingkai jendela 1/1000 menggunakan
(new Date()).getTime()
:Kedua, kami mencoba solusi yang diusulkan yang menghindari tabrakan di jendela 1/1000:
Yang mengatakan kita dapat mempertimbangkan untuk menggunakan fungsi seperti node
process.nextTick
yang dipanggil dalam event loop sebagai satutick
dan dijelaskan dengan baik di sini . Tentu saja di browser tidak adaprocess.nextTick
jadi kita harus memikirkan bagaimana cara melakukannya. Ini implementasi akan menginstalnextTick
fungsi dalam browser menggunakan sebagian besar fungsi lebih dekat dengan I / O di browser yangsetTimeout(fnc,0)
,setImmediate(fnc)
,window.requestAnimationFrame
. Seperti yang disarankan di sini kita bisa menambahkanwindow.postMessage
, tapi saya serahkan ini kepada pembaca karena perluaddEventListener
juga. Saya telah memodifikasi versi modul asli agar lebih sederhana di sini:Jadi kita ada di jendela 1/1000:
sumber
Mungkin lebih baik lagi menggunakan getTime () atau valueOf (), tetapi cara ini mengembalikan angka unik plus yang dapat dimengerti manusia (mewakili tanggal dan waktu):
sumber
sumber
Mudah dan selalu dapatkan nilai unik:
sumber
Saya telah melakukan cara ini
sumber
sumber
mengacu pada solusi #Marcelo Lazaroni di atas
mengembalikan angka seperti ini 1567507511939.4558 (terbatas pada 4 desimal), dan akan memberikan angka tidak unik (atau benturan) setiap 0,1%.
menambahkan toString () memperbaiki ini
Date.now() + Math.random().toString()
mengembalikan '15675096840820.04510962122198503' (string), dan lebih jauh lagi 'lambat' sehingga Anda tidak akan pernah mendapatkan milidetik yang 'sama'.
sumber
sumber
Menggunakan
toString(36)
, sedikit lambat, berikut adalah solusi yang lebih cepat dan unik:sumber
Untuk mendapatkan nomor unik:
Contoh:
Anda dapat mengubah panjangnya menggunakan:
sumber
solusi sederhana yang saya temukan
var today = new Date (). valueOf ();
console.log (hari ini);
sumber