dalam kasus saya, sebagian besar id akan dibuat dalam sejumlah besar klien seluler, bukan dalam kumpulan server yang terbatas. Saya ingin tahu apakah dalam kasus ini, ada kekhawatiran yang beralasan.
Kedengarannya seperti arsitektur yang sangat buruk bagi saya. Apakah Anda menggunakan arsitektur dua tingkat? Mengapa klien seluler memiliki akses langsung ke db? Apakah Anda benar-benar ingin mengandalkan keamanan berbasis jaringan?
Bagaimanapun, beberapa pertimbangan tentang kemungkinan tabrakan:
Baik UUID maupun ObjectId tidak bergantung pada ukurannya, yaitu keduanya bukan angka acak, tetapi mereka mengikuti skema yang mencoba mengurangi kemungkinan tabrakan secara sistematis. Dalam kasus ObjectIds, strukturnya adalah:
- 4 byte detik sejak zaman unix
- ID mesin 3 byte
- ID proses 2 byte
- Penghitung 3 byte
Ini berarti, bertentangan dengan UUID, ObjectId bersifat monoton (kecuali dalam satu detik), yang mungkin merupakan properti terpentingnya. Indeks monoton akan menyebabkan B-Tree diisi lebih efisien, memungkinkan paging berdasarkan id dan memungkinkan 'pengurutan default' berdasarkan id untuk membuat kursor Anda stabil, dan tentu saja, mereka membawa cap waktu yang mudah diekstraksi. Ini adalah pengoptimalan yang harus Anda waspadai, dan ini bisa sangat besar.
Seperti yang Anda lihat dari struktur 3 komponen lainnya, tabrakan menjadi sangat mungkin terjadi jika Anda melakukan> 1k penyisipan/dtk pada satu proses (tidak mungkin, bahkan dari server), atau jika jumlah mesin bertambah melewati sekitar 10 (lihat masalah ulang tahun), atau jika jumlah proses pada satu mesin tumbuh terlalu besar (sekali lagi, itu bukan angka acak, tetapi mereka benar-benar unik pada mesin, tetapi harus dipersingkat menjadi dua byte ).
Secara alami, agar tabrakan terjadi, mereka harus cocok di semua aspek-aspek ini, jadi meskipun dua mesin memiliki hash mesin yang sama, klien tetap harus memasukkan nilai penghitung yang sama dalam detik yang sama dan id proses yang sama, tetapi ya, nilai-nilai ini dapat bertabrakan.