Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Risiko tabrakan UUID menggunakan algoritma yang berbeda

Risiko tabrakan meningkat sedikit tetapi masih semakin kecil. Pertimbangkan bahwa:

  • Sisir dan NEWID /NEWSEQUENTIALID sertakan stempel waktu dengan presisi hingga beberapa ms. Jadi, kecuali jika Anda membuat ID dalam jumlah besar pada waktu yang sama persis dari semua sumber yang berbeda ini, secara harfiah tidak mungkin agar ID bertabrakan.

  • Bagian dari GUID yang bukan berdasarkan stempel waktu dapat dianggap sebagai acak; kebanyakan algoritma GUID mendasarkan angka-angka ini pada PRNG. Dengan demikian, kemungkinan tabrakan antara 10 byte lainnya ini berada pada urutan yang sama seperti jika Anda menggunakan dua generator angka acak yang terpisah dan mengamati tabrakan.

    Pikirkan tentang ini sejenak - PRNG dapat dan melakukan angka berulang, sehingga kemungkinan tabrakan antara keduanya tidak jauh lebih tinggi daripada tabrakan hanya menggunakan salah satu dari mereka, bahkan jika mereka menggunakan algoritma yang sedikit berbeda. Ini seperti memainkan nomor lotre yang sama setiap minggu vs. memilih set acak setiap minggu - peluang menangnya sama persis.

Sekarang, perlu diingat bahwa ketika Anda menggunakan algoritme seperti Guid.Comb, Anda hanya memiliki 10 bit uniqueifier, yang setara dengan 1024 nilai terpisah. Jadi, jika Anda membuat sejumlah besar GUID dalam beberapa milidetik yang sama, Anda akan mendapatkan tabrakan. Tetapi jika Anda menghasilkan GUID pada frekuensi yang cukup rendah, tidak masalah berapa banyak algoritme berbeda yang Anda gunakan pada saat yang sama, kemungkinan tabrakan hampir tidak ada.

Cara terbaik bagi Anda untuk benar-benar yakin adalah dengan menjalankan tes; minta semua 2 atau 3 (atau berapa pun yang Anda gunakan) menghasilkan GUID, pada saat yang sama, secara berkala, dan tuliskan ke file log, dan lihat apakah Anda mendapatkan tabrakan (dan jika demikian, berapa banyak). Itu akan memberi Anda ide bagus tentang seberapa aman praktik ini.

P.S. Jika Anda menggunakan generator sisir NHibernate untuk menghasilkan GUID untuk kunci utama yang dikelompokkan, pertimbangkan untuk menggunakan NEWSEQUENTIALID() bukannya NEWID() - inti dari Comb adalah untuk menghindari pemisahan halaman, dan Anda tidak mencapainya jika Anda memiliki proses lain yang menggunakan algoritme non-sekuensial. Anda juga harus mengubah kode apa pun menggunakan Guid.NewGuid untuk menggunakan generator Sisir yang sama - algoritma Sisir yang sebenarnya digunakan di NHibernate tidak rumit dan mudah diduplikasi dalam logika domain Anda sendiri.

† ​​Perhatikan bahwa tampaknya ada perselisihan tentang NEWID , dan apakah berisi stempel waktu atau tidak. Bagaimanapun, karena didasarkan pada alamat MAC, kisaran nilai yang mungkin jauh lebih kecil daripada GUID V4 atau Sisir. Alasan lebih lanjut bagi saya untuk merekomendasikan untuk tetap menggunakan Comb GUID di luar database dan NEWSEQUENTIALID di dalam basis data.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Memperbaiki "Nama korelasi harus ditentukan untuk kumpulan baris massal di klausa dari." di SQL Server

  2. SQL Server:UPDATE tabel dengan menggunakan ORDER BY

  3. Log Transaksi SQL Server, Bagian 3:Dasar-dasar Pencatatan

  4. Bagaimana cara mendapatkan Insert id di MSSQL di PHP?

  5. Tipe data untuk menyimpan alamat ip di SQL Server