- Basis data hari ini mendeteksi UUID v4 duplikat, dan nilainya ternyata persis sama dengan
b6133fd6-70fe-4fe3-bed6-8ca8fc9386cd pada record yang ditambahkan pada 2025
- Paket yang digunakan adalah uuid dari npm, dan katanya UUID dibuat dengan cara
import { v4 as uuidv4 } from "uuid"; lalu const document_id = uuidv4();, kemudian dimasukkan ke basis data
- Basis data itu hanya memiliki sekitar 15.000 record, jadi secara statistik tampak mustahil, dan ia bertanya apakah ada orang lain yang pernah mengalami hal yang sama
1 komentar
Komentar Hacker News
jandrewrogers: Ini ternyata cukup umum. Keamanan UUIDv4 bergantung pada asumsi bahwa ada sumber entropi berkualitas tinggi, tetapi asumsi ini mudah rusak karena cacat perangkat keras, bug perangkat lunak biasa, atau kurangnya pemahaman pengembang tentang entropi
Mendeteksi apakah sumber entropi rusak itu cukup mahal, jadi hampir tak ada yang melakukannya, dan akhirnya baru ketahuan setelah tabrakan terjadi. Karena itu, di banyak sistem dengan keandalan dan jaminan tinggi, UUIDv4 secara eksplisit dilarang
Semakin banyak sumber entropi, semakin baik, dan cukup banyak di antaranya harus non-deterministik. Bahkan dalam game skala kecil, jika nilai seperti koordinat mouse, jeda antar input tombol, atau jumlah frame sebelum tombol start ditekan dicampurkan ke seed awal, maka meskipun secara internal tetap memakai pseudorandom generator, hasilnya jauh lebih sulit diprediksi. Saya akan kecewa jika CloudFlare memakai kurang dari 100 sumber entropi
Ini terjadi bila nilai balik seperti “meminta N byte tetapi hanya 3 byte yang dikembalikan, jadi harus meminta lagi N-3 byte” tidak divalidasi, seperti yang dulu pernah terjadi di Go. Pada kebanyakan perangkat keras atau sistem operasi ini jarang meledak, jadi orang tidak mengeceknya, lalu suatu hari di lingkungan produksi baru terlihat ada puluhan ribu tabrakan
throwaway_19sz: Sulit dipercaya dan lucu, tapi ini nyata. Sepuluh tahun lalu seorang teman bergabung sebagai CTO di startup yang tumbuh sangat cepat, perusahaan dengan sekitar 200 developer, dan pada minggu pertamanya dia menemukan ada microservice khusus pembuat UUID
Untuk satu endpoint saja ada 3 engineer khusus, bahkan ada juga orang database. Setiap tim harus memanggil layanan ini bila butuh UUID baru yang “aman”, dan layanan itu akan membuat UUID, mengecek di DB internalnya apakah UUID itu sudah pernah diterbitkan, lalu jika belum akan disisipkan dan dikembalikan. Entah demi ketenangan batin atau apa, tim itu bahkan punya papan kanban dan sprint sendiri
Startup yang saya masuki kemudian malah selalu membuat microservice baru dan tim baru setiap kali seseorang menemukan kekhawatiran baru. Target kuartalan secara eksplisit adalah memperbesar ukuran tim engineering, dan tim-tim beranggotakan 3~4 orang menciptakan pekerjaan mereka sendiri lewat sprint dan rapat perencanaan mereka. Saya pernah mengusulkan agar personel dari proyek yang stabil dipindahkan ke pekerjaan mendesak, tetapi ditolak karena bertentangan dengan KPI yang mewajibkan jumlah engineer mencapai angka tertentu
Untuk ketersediaan tinggi dan deployment global, ini juga bisa di-shard dengan memberi tiap instance rentang ID khusus. Sisihkan sebagian bit atas untuk ID data center dan beberapa bit lagi untuk instance pembuat ID di dalamnya. Tunggu, rasanya saya pernah melihat ini di suatu tempat… Saya penasaran apakah Twitter masih memakai cara ini, atau akhirnya menggantinya
Setiap hari mereka mengambil dump DB untuk pengecekan saat membuat ID “sementara”, dan baru menjadi “final” setelah benar-benar diserahkan ke CMDB. Ada guardrail agar ID sementara tidak dipakai di produksi, dan ada juga prosedur untuk mendaur ulang ID final yang tidak terpakai. Terakhir saya dengar, mereka sudah 18 bulan menjalankan proyek 6 bulan untuk memindahkan cache DB lokal ke Zookeeper
CodesInChaos: Biasanya ini terjadi karena pseudorandom generator dengan seed yang buruk. Penting apakah UUID dibuat di backend atau frontend
Frontend pada dasarnya sulit dipercaya karena berbagai alasan, termasuk tabrakan yang disengaja, jadi penanganan tabrakan tetap diperlukan. Backend bisa dibuat andal. Dulu VM memang pernah punya masalah seperti ini, tetapi seharusnya sekarang sudah teratasi, meski proses yang sangat tersandbox dan memakai jalur fallback angka acak yang tidak aman masih bisa kena. Fork proses atau VM juga bisa membuat tabrakan karena menyalin state
kst: Ini mengingatkan saya pada satu bagian di “Pro Git”. <https://git-scm.com/book/en/v2>
Contohnya, kalau 6,5 miliar orang di bumi semuanya setiap detik membuat kode sebesar seluruh riwayat Linux kernel dan mendorongnya ke satu repositori Git raksasa, tetap butuh kira-kira 2 tahun agar peluang tabrakan objek SHA-1 mencapai 50%. Jadi saya suka ungkapan bahwa peluang tabrakan SHA-1 alami lebih kecil daripada peluang semua anggota tim Anda mati pada malam yang sama karena serangan serigala yang tak saling berkaitan. SHA-1 hash bukan angka acak dan 160-bit, jadi berbeda dari UUIDv4, tetapi saya suka analogi serangan serigala yang tak saling berkaitan itu
Analogi semacam: berjalan mengelilingi bumi dari khatulistiwa satu langkah tiap 1 miliar tahun, tiap satu putaran mengambil setetes air dari Samudra Pasifik, dan setelah samudra habis menumpuk selembar kertas, lalu mengulanginya sampai tumpukan itu mencapai matahari, namun tiga digit pertama pada timer 52! detik tetap tidak berubah
e12e: Ada pembahasan terkait di sini: https://github.com/uuidjs/uuid/issues/546
Misalnya disebutkan bahwa saat
crypto.getRandomValues()diuji di googlebot, hasilnya deterministikadyavanapalli: Kejadian yang dibicarakan ini sangat langka, sampai-sampai kemungkinan bumi dihancurkan asteroid tepat saat ini lebih besar
Saya pernah dengar ada perempuan yang benar-benar tertimpa meteorit tetapi selamat dengan cedera kaki. Jika terjadi tabrakan UUID, kemungkinan yang sangat dominan adalah bug perangkat lunak atau anomali komputer, meski bisa juga sinar kosmik. Sinar kosmik yang mengganggu memori atau CPU lebih umum daripada dugaan orang
juancn: Apakah inisialisasi generator angka acaknya aneh atau entropinya kurang? Jika tidak dikustomisasi, biasanya yang dipakai adalah
crypto.getRandomValues(rnds8), dangetRandomValuestidak menyatakan jumlah minimum entropiGeee: Menurut interpretasi banyak dunia dalam mekanika kuantum, pasti ada satu cabang alam semesta tempat semua UUID sama. Saya membayangkan seperti apa pikiran orang-orang di sana
mittermayr: Saya sangat setuju bahwa ini terdengar tidak masuk akal. Tapi kalau menebak, dulu mereka membuat UUIDv4 di ponsel pengguna lalu mengirimkannya ke DB, sedangkan UUID yang bentrok pagi ini dibuat di server Ubuntu, dan itulah bedanya
Saya tidak tahu bagaimana tepatnya UUIDv4 dibuat atau apakah karakteristik mesin pembuat ikut masuk ke algoritmenya, tetapi satu-satunya perubahan yang terpikir adalah bahwa dulu dibuat di perangkat, lalu beberapa bulan lalu mulai dibuat di server
Tapi di server, apalagi pada 2026, itu seharusnya tidak boleh terjadi. Dulu seed angka acak pada VM memang bermasalah, tetapi sekarang seharusnya lebih baik. Bahkan jika satu UUID dibuat dengan buruk, peluang UUID yang benar-benar acak menabraknya tetap sangat kecil, jadi kedua generatornya kemungkinan sama-sama bermasalah
dweez: Sudah waktunya membaca ulang tulisan menarik ini: https://jasonfantl.com/posts/Universal-Unique-IDs/
Jika seluruh alam semesta diubah menjadi komputer raksasa yang hanya membuat UUID sampai heat death, berapa bit yang dibutuhkan ruang ID itu?
beejiu: Saya penasaran apakah UUID dibuat di sisi klien atau sisi server. Kalau di sisi klien, bisa jadi karena bot crawler. Misalnya, Googlebot menjalankan JavaScript dengan “keacakan” yang deterministik
Penjelasan seperti ini jauh beberapa orde magnitudo lebih masuk akal daripada tabrakan acak sungguhan
merlindru: Besar kemungkinan masalah seed. Jika Anda bisa membuktikan bukan itu, Anda mungkin akan sedikit terkenal
erlkonig: Saya selalu bilang ke tim bahwa jika datanya cukup banyak, nilai acak pada akhirnya bisa bertabrakan, dan saat itu kita akan melihat seberapa tangguh perangkat lunak kita
Meski begitu, masih banyak developer senior, lead tim, dan CIO yang percaya itu mustahil dan sama sekali tidak menulis kode untuk menangani situasi tersebut. Akibatnya generator angka acak yang buruk bisa merusak sistem jauh lebih cepat dari dugaan, dan kerusakan simultan pun mungkin terjadi tanpa deteksi atau regenerasi. Rasanya sama seperti golongan orang yang tidak memeriksa apakah
malloc()berhasil. Saya kadang bertanya, “Kalau memang mustahil, bukankah berarti kita memakai terlalu banyak bit?”leni536: Ini bukan terjadi secara kebetulan, ada bug di suatu tempat. Sepintas kelihatannya paket itu memanggil
crypto.randomUUID()dari runtime JS, dan ini seharusnya selalu di-seed dengan benarKemungkinan bug pada runtime tampak sangat kecil, tapi siapa tahu. Saya penasaran runtime JS apa yang dipakai
jbverschoor: Penyebab yang paling masuk akal adalah paket angka acak yang menjadi dependensi
uuidbaru-baru ini dikompromikan sehingga angka “acak” bisa diprediksi. Akibatnya, banyak proyek terkait kriptografi, SSL, dan mata uang bisa ikut berisiko karena serangan rantai pasokuuid/src/rng.ts, array acak diubah menjadiconst. Semua pemanggilan jadi berbagi array acak yang samaPemanggilan berikutnya akan memperbarui kode acak sebelumnya, jadi kalau Anda membuat sesuatu yang penting, semoga beruntung. Kode lama membuat salinan baru dengan
slice(). Mungkin ini perubahan yang tidak disengaja, tetapi saya tidak mengerti bagaimana bisa lolos, karena rasanya tes yang membuat dua angka acak lalu mengecek apakah keduanya berbeda pun tidak akan lolospif: Bahkan dengan sumber entropi berkualitas tinggi, Anda tidak bisa mengubah “kemungkinan besar begitu” menjadi “pasti begitu”. Jika Anda butuh nilai yang sulit ditebak, cari solusi kriptografi, tetapi jika Anda butuh keunikan yang terjamin, Anda harus membuatnya sendiri
athrowaway3z: Aturan praktis yang sederhana adalah memikirkan apakah ID bisa memasukkan timestamp selain nilai acak. Biasanya jawabannya ya, dan UUIDv7 sudah cukup
Jika Anda sudah menelaah masalah ini sedalam sampai bisa menulis pembuktian bahwa kebocoran informasi tidak dapat diterima, selamat. Sistem itu mungkin cukup kompleks dan lambat sehingga lebih cocok memakai hash kriptografis yang kuat, atau kalau malas cukup UUIDv5
darqis: PostgreSQL 18 mendukung uuidv7 secara native, dan default-nya bisa cukup
uniquedanuuid7()tumdum_: Itu pseudorandom generator dengan seed buruk
serf: Peluangnya sekitar 1 banding 4,72 × 10²⁸, atau sekitar 1 banding 47,3 oktiliun. Kalau ini benar, sebelum beli lotre saya justru akan curiga pada race condition atau kesalahan sederhana lain
evnix: Bahkan tanpa membahas matematika probabilitas, realitas tempat kita hidup ini membuat bahkan generator angka acak perangkat keras terbaik pun bisa kurang acak dari yang kita kira
Jika keamanan bukan hal penting, saya akan pindah ke sesuatu seperti TSID, atau ke uuidv7, agar dalam praktik kejadian seperti ini nyaris tidak terjadi. Menurut saya itu lebih baik daripada overengineering kode dengan retry
jordiburgos: Tolong jangan pakai
b6133fd6-70fe-4fe3-bed6-8ca8fc9386cd. Saya cek DB saya, ternyata sudah dipakai16b55183-1697-496e-bc8a-854eb9aae0f3, dan mungkin ada lagi. Kalau semua orang memposting daftar mereka di sini, mungkin kita bisa mengecek duplikat?pyuser583: Saya penasaran, UUID apa yang sekarang paling disukai orang
smokel: Sudah berkali-kali saya menyalahkan compiler, sinar kosmik, efek kuantum, atau minimal bug kernel yang aneh, lalu akhirnya sadar bahwa sumber bug-nya adalah saya sendiri
Tabrakan pada 15.000 record terlalu kecil kemungkinannya, jadi saya akan lebih dulu mencurigai penyebab lain: penanganan duplikasi, request yang terkirim ulang, objek yang dipakai ulang, log yang menyesatkan, atau penggunaan ulang identifier dari jalur kode lain. Kalau Anda membagikan sedikit lebih banyak kode di sekitarnya, mungkin kita bisa ikut memeriksa
wazoox: Belum pernah terjadi pada saya, tapi dua hari lalu saya menemukan ini jauh di dalam codebase PHP produksi: fungsi
createUUID()yang memotong nilai darimd5(uniqid('', true))lalu menempelkannya agar berbentuk seperti UUIDSaya tidak tahu bagaimana kengerian seperti ini sampai sekarang belum menggigit titik lemah kami
sedatk: Di
uuidjs/uuidada peringatan bahwa klien dengan generator angka acak deterministik seperti Googlebot dapat menghasilkan UUID duplikatDisebutkan bahwa ini bisa jadi masalah untuk aplikasi yang mengharapkan UUID buatan klien selalu unik, sehingga perlu strategi untuk memeriksa duplikasi dan gagal dengan elegan, atau menonaktifkan operasi tulis dari klien Googlebot: https://github.com/uuidjs/uuid/commit/91805f665c38b691ac2cbd...
xyzzy123: Saya pernah mengalami load test jangka panjang pada sistem terdistribusi berbasis Linux gagal karena UUID duplikat
Setelah penyelidikan panjang, ternyata itu bug kernel, tepatnya race condition. Pada sistem multiprosesor, jika dua proses membaca
/dev/randomsecara bersamaan, dalam kasus yang sangat langka, kira-kira 1 banding sejuta, mereka bisa menerima byte yang sama. Saya mungkin akan lebih dulu memeriksa inisialisasi generator angka acakbaq: Sepertinya VM yang berjalan telah membuang semua entropi lewat virtualisasi
glaslong: Sepertinya saya perlu beli beberapa lava lamp
0xfffafaCrash: Saya penasaran apakah UUID dibuat di frontend atau backend. Jika di frontend, daripada masalah entropi saya akan lebih bertaruh bahwa kode klien atau request dimanipulasi untuk menyuntikkan UUID yang sudah diketahui
latentframe: Salah satu kalimat paling berbahaya dalam engineering adalah secara statistik mustahil. Pada skala yang cukup besar, kasus ekstrem berhenti jadi teori dan berubah menjadi kejadian operasional
8organicbits: Tahun lalu saya pernah menulis soal tabrakan nyata, termasuk pustaka yang terlibat: https://alexsci.com/blog/uuid-oops/
Agar UUID tahan terhadap tabrakan, ada banyak batasan yang harus dipatuhi dengan ketat, dan dalam kasus ini tampaknya besar kemungkinan ada masalah pada generator angka acaknya
nu11ptr: Pada akhirnya ini masalah sumber entropi. Karena itu saya selalu membuat dan menyisipkannya di dalam loop. Kalau terjadi tabrakan, saya bisa menanganinya dengan elegan
sbuttgereit: Ini bukan “secara teknis mustahil”. Ini sangat mungkin secara teknis. Jika keacakannya bagus, peluangnya hanya sangat, sangat kecil, dan tidak ada apa pun pada UUIDv4 yang secara teknis mencegahnya menghasilkan nilai duplikat
beardyw: Mungkin ini pertanyaan bodoh, tapi kenapa tidak menambahkan tanggal, setidaknya dalam bentuk detik heksadesimal? Rasanya dengan menambah beberapa byte saja, sesuatu yang aman sekarang bisa tetap dijamin aman di masa depan
mdavid626: Ada penjelasan lain juga. Misalnya seseorang memodifikasi request secara manual, atau mengutak-atik DB
radial_symmetry: Saya juga pernah mengalami hal seperti ini sekali dan sempat merasa saya mulai gila, jadi membaca komentar-komentar di sini membuat saya lega
NKosmatos: Ini bukan “secara teknis mustahil”. Bukan mustahil, hanya sangat, sangat kecil kemungkinannya. Mungkin Anda harus beli tiket lotre
Setiap kali saya memakai kata “improbable”, saya teringat https://hitchhikers.fandom.com/wiki/Infinite_Improbability_D...
sudb: Untuk pertama kalinya saya merasa keputusan memilih CUID2 di salah satu proyek saya ternyata memang ide yang bagus: https://github.com/paralleldrive/cuid2