Apakah GUID unik 100% dari waktu?


519

Apakah GUID unik 100% dari waktu?

Apakah ini akan tetap unik di beberapa utas?


265
Tidak, tidak 100% ... Hanya 99,99999999999999999999999999999999999999999999999999999999999999999999999999999999999999% lebih tinggi;)
JohannesH

52
Pertama-tama, sebuah GUID bukanlah tanpa batas, yang berarti bahwa untuk arti harfiah "100% dari waktu", akan berarti bahwa tidak peduli berapa lama Anda terus menghasilkan GUID, mereka akan selalu unik. Ini bukan kasusnya. Juga, sejak implementasi awal, di mana kartu jaringan serial unik / id / MAC digunakan untuk menghasilkan bagian dari kunci tidak lagi digunakan, karena berbagai alasan, sebuah GUID tidak benar-benar unik secara global lagi. Namun, ini unik secara lokal . Dengan kata lain, jika Anda terus menghasilkan GUID pada satu mesin, Anda tidak akan mendapatkan duplikat.
Lasse V. Karlsen

36
@ojrac Saya hanya memilih untuk membulatkan ...: P
JohannesH

403
Setiap kali saya menghasilkan GUID, saya merasa seperti mencuri satu dari Semesta. Terkadang saya berpikir tentang orang jahat yang menghasilkan GUID jauh lebih banyak dari yang mereka butuhkan dan GUID yang terbuang itu begitu kesepian sehingga tidak digunakan atau dihasilkan lagi ...
asavartsov

29
@asavartsov Saya pikir Anda akan suka wastaguid.info ^ _ ^
Navin

Jawaban:


431

Sementara setiap GUID yang dihasilkan tidak dijamin unik, jumlah total kunci unik (2 128 atau 3,4 × 10 38 ) sangat besar sehingga kemungkinan nomor yang sama dihasilkan dua kali sangat kecil. Sebagai contoh, perhatikan alam semesta yang dapat diamati, yang berisi sekitar 5 × 10 22 bintang; setiap bintang kemudian dapat memiliki 6,8 × 10 15 GUID universal unik.

Dari Wikipedia .


Ini adalah beberapa artikel bagus tentang bagaimana GUID dibuat (untuk .NET) dan bagaimana Anda bisa mendapatkan panduan yang sama dalam situasi yang tepat.

https://ericlippert.com/2012/04/24/guid-guide-part-one/

https://ericlippert.com/2012/04/30/guid-guide-part-two/

https://ericlippert.com/2012/05/07/guid-guide-part-three/

​​


115
Bukankah mereka akan disebut UUID? ;)
Arafangion

28
GUID adalah spesifik microsoft untuk implementasi standar UUID. Jadi, keduanya. ID unik global vs. ID unik universal.
Adam Davis

40
Secara teknis, ini bukan 2 ^ 128, karena dalam GUID v4, Anda memiliki satu digit hex yang akan selalu menjadi 4 (secara efektif menghapus 4 bit), dan dua bit selanjutnya juga disediakan. Namun, 2 ^ 122 GUID V4 yang valid masih menyisakan sekitar 5x10 ^ 36, yang akan berlaku untuk saya. dan untuk kamu juga. Setiap bintang harus menerima masing-masing 1.1x10 ^ 14 GUID.
Andrew Shelansky

67
Jika Anda seperti saya, maka Anda akan ingin tahu bahwa 2^128ditulis kira-kira: 34,028,236,692,093,846,346,337,460,743,177,000,000. Secara statistik, jika Anda menghitung 1000 GUID setiap detik, masih butuh triliunan tahun untuk mendapatkan duplikat.
Entitas

26
Saya hanya berpikir itu lucu untuk membacanya jadi di sini bersenang-senang guys :) Tiga puluh empat undecillion dua puluh delapan decillion dua ratus tiga puluh enam nonillion enam ratus sembilan puluh dua octillion sembilan puluh tiga septillion delapan ratus empat puluh enam sextillion tiga ratus empat puluh enam quintillion tiga ratus tiga puluh tujuh kuadriliun empat ratus enam puluh triliun tujuh ratus empat puluh tiga miliar seratus tujuh puluh tujuh juta
hjavaher

85

Jika Anda takut dengan nilai-nilai GUID yang sama, maka letakkan dua di antaranya satu sama lain.

Guid.NewGuid().ToString() + Guid.NewGuid().ToString();

Jika Anda terlalu paranoid maka taruh tiga.


64
Anda harus sangat, sangat, sangat, sangat paranoid untuk menambahkan 3 GUID.
harsimranb

25
@harsimranb Tidak ... sangat, sangat, sangat, sangat paranoid adalah 6 GUID. Paranoid adalah satu ditambahkan, sangat paranoid dua ditambahkan, dll.
Suamere

37
@Suamere Saya telah menciptakan sebuah situs web untuk menghitung tingkat paranoid Anda jogge.github.io/HowParanoidAmI
Jogge

3
@Jogge xD Itu luar biasa, lol. Setelah 9 9 999999999dalam bentuk Anda, saya pikir Paranoia akan mem-splode Browser saya.
Suamere

66

Jawaban sederhananya adalah ya.

Raymond Chen menulis artikel hebat tentang GUID dan mengapa substring dari GUID tidak dijamin unik. Artikel ini masuk ke beberapa kedalaman tentang cara GUID dihasilkan dan data yang mereka gunakan untuk memastikan keunikan, yang harus menjelaskan mengapa mereka :-)


23
Saya pikir artikel Chen mengacu pada V1 dari algoritma generasi GUID, yang menggunakan alamat MAC & cap waktu - V4 saat ini menggunakan nomor pseudo-acak sebagai gantinya: en.wikipedia.org/wiki/Globally_Unique_Identifier#Algorithm
Barrett

2
tautannya sudah mati - 403 Forbidden
daya


39

Sebagai catatan, saya bermain-main dengan Volume GUID di Windows XP. Ini adalah tata letak partisi yang sangat tidak jelas dengan tiga disk dan empat belas volume.

\\?\Volume{23005604-eb1b-11de-85ba-806d6172696f}\ (F:)
\\?\Volume{23005605-eb1b-11de-85ba-806d6172696f}\ (G:)
\\?\Volume{23005606-eb1b-11de-85ba-806d6172696f}\ (H:)
\\?\Volume{23005607-eb1b-11de-85ba-806d6172696f}\ (J:)
\\?\Volume{23005608-eb1b-11de-85ba-806d6172696f}\ (D:)
\\?\Volume{23005609-eb1b-11de-85ba-806d6172696f}\ (P:)
\\?\Volume{2300560b-eb1b-11de-85ba-806d6172696f}\ (K:)
\\?\Volume{2300560c-eb1b-11de-85ba-806d6172696f}\ (L:)
\\?\Volume{2300560d-eb1b-11de-85ba-806d6172696f}\ (M:)
\\?\Volume{2300560e-eb1b-11de-85ba-806d6172696f}\ (N:)
\\?\Volume{2300560f-eb1b-11de-85ba-806d6172696f}\ (O:)
\\?\Volume{23005610-eb1b-11de-85ba-806d6172696f}\ (E:)
\\?\Volume{23005611-eb1b-11de-85ba-806d6172696f}\ (R:)
                                     | | | | |
                                     | | | | +-- 6f = o
                                     | | | +---- 69 = i
                                     | | +------ 72 = r
                                     | +-------- 61 = a
                                     +---------- 6d = m

Bukan karena GUID sangat mirip tetapi fakta bahwa semua GUID memiliki string "mario" di dalamnya. Apakah itu kebetulan atau ada penjelasan di balik ini?

Sekarang, ketika googling untuk bagian 4 di GUID saya menemukan sekitar 125.000 hit dengan GUID volume.

Kesimpulan: Ketika datang ke GUID Volume mereka tidak seunik GUID lain.


31
Ingat iklan Super Mario Bros 3 dari tahun 80-an? Semua orang berteriak, "Mario! Mario! Mario!" di seluruh dunia sedikit mengacaukan keacakan alam semesta.
MGOwen

24
Jika Anda menghapus instalan Office 2010 secara manual msiexec, ini mencantumkan semua MSI GUID tentang program kantor. Mereka semua mengeja 0FF1CE. Sepertinya Microsoft memiliki interpretasi yang cukup ... longgar ... tentang cara membuat GUID;)
Mark Henderson

3
GUID partisi ini semuanya dibuat bersama pada 2009-12-17 @ 14:47 UTC. Mereka unik untuk mesin Anda, tetapi menempatkan "mario" sebagai pengidentifikasi simpul tidak benar - itu berarti mereka tidak sesuai dengan RFC-4122. Demikian pula, 0FF1CEGUID berada di bawah bagian "Kompatibilitas mundur NCS" dari RFC-4122, tetapi tidak mungkin bahwa Microsoft mengikuti aturan NCS untuk nilai-nilai tersebut.
Stephen Cleary

16
Saya tahu itu, Administrasi Keamanan Nintendo telah mengkompromikan generator nomor acak.
MetaGuru

1
mungkin ini ball park yang sama dengan nama perusahaan yang membuat air mineral (mendengar mereka memimpin pasar) Evian. Dieja terbalik memberi Naif :-)
Mariusz

31

Seharusnya tidak terjadi. Namun, ketika .NET berada di bawah beban yang berat, dimungkinkan untuk mendapatkan panduan duplikat. Saya memiliki dua server web berbeda menggunakan dua server sql berbeda. Saya pergi untuk menggabungkan data dan menemukan saya memiliki 15 juta guid dan 7 duplikat.


1
Bagaimana ini bisa dilakukan pada dua mesin yang berbeda? Saya pikir bagian dari GUID adalah nama mesin? (tidak berdebat ... hanya bertanya)
John Cruz

8
Ini hanya berlaku untuk panduan v1 yang menggunakan alamat MAC (bukan nama mesin) sebagai bagian dari generasi GUID. The v4, yang merupakan STD de facto tidak lagi menggunakan alamat Mac tetapi nomor acak palsu.
Xander

14
Guid.NewGuidselalu menghasilkan GUID v4 (dan selalu memiliki). Tim pasti memiliki sumber entropi yang sangat buruk.
Stephen Cleary

1
Apakah itu pernah ditiru? itu masalah besar jika itu masalahnya.
Zyo

1
Sama di sini saat Mengimpor Kumpulan data yang sangat besar. Dari sekitar 10-100 Juta Anda mendapatkan duplikat dari Guid.NewGuid
Stephan Baltzer

28

Ya, GUID harus selalu unik. Ini didasarkan pada perangkat keras dan waktu, ditambah beberapa bit tambahan untuk memastikan itu unik. Saya yakin secara teori mungkin berakhir dengan dua yang identik, tetapi sangat tidak mungkin dalam skenario dunia nyata.

Inilah artikel hebat oleh Raymond Chen tentang Panduan:

https://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx


5
Artikel ini agak lama dan merujuk pada v1 GUID. v4 tidak menggunakan perangkat keras / waktu tetapi algoritma bilangan acak sebagai gantinya. en.wikipedia.org/wiki/Globally_unique_identifier#Algorithm
Mani Gandham

Tautan ini rusak
Marcel


23

Panduan secara statistik unik. Kemungkinan dua klien berbeda menghasilkan Guid yang sama sangat kecil (dengan asumsi tidak ada bug dalam kode yang menghasilkan Guid). Anda mungkin juga khawatir tentang kesalahan prosesor Anda karena sinar kosmik dan memutuskan bahwa 2 + 2 = 5 hari ini.

Beberapa utas yang mengalokasikan panduan baru akan mendapatkan nilai unik, tetapi Anda harus mengetahui bahwa fungsi yang Anda panggil aman dari utas. Di lingkungan mana ini?


19

Eric Lippert telah menulis serangkaian artikel yang sangat menarik tentang GUID.

Ada komputer pribadi dengan urutan 2 30 di dunia (dan tentu saja banyak perangkat genggam atau perangkat komputasi non-PC yang memiliki tingkat daya komputasi yang kurang lebih sama, tetapi mari abaikan itu). Mari kita asumsikan bahwa kita menempatkan semua PC di dunia untuk tugas menghasilkan GUID; jika masing-masing dapat menghasilkan, katakanlah, 20 GUIDs per detik kemudian setelah hanya sekitar 72 detik - seratus lima puluh triliun tahun - Anda akan memiliki peluang yang sangat tinggi untuk menghasilkan tabrakan dengan GUID spesifik Anda. Dan kemungkinan tabrakan menjadi cukup baik setelah hanya tiga puluh triliun tahun.


28
... dan dia melanjutkan di paragraf berikutnya: "Tapi itu mencari tabrakan dengan GUID tertentu. [...] Jadi jika kita menempatkan miliar PC itu untuk bekerja menghasilkan GUIDs 122-bit-of-randomness, probabilitas bahwa dua dari mereka di suatu tempat di sana akan bertabrakan menjadi sangat tinggi setelah sekitar 2 ^ 61 GUID dihasilkan. Karena kami mengasumsikan sekitar 2 ^ 30 mesin melakukan 2 ^ 20 GUID per detik, kami akan mengharapkan tabrakan setelah sekitar 2 ^ 11 detik, yaitu sekitar satu jam . " (Dan akhirnya ia menjelaskan bahwa, tentu saja, tidak banyak GUID yang dihasilkan.)
Arjan

16

Secara teori, tidak, mereka tidak unik. Dimungkinkan untuk menghasilkan panduan yang identik berulang kali. Namun, kemungkinan itu terjadi sangat rendah sehingga Anda dapat menganggapnya unik.

Saya telah membaca sebelumnya bahwa kemungkinannya sangat rendah sehingga Anda benar-benar harus menekankan tentang sesuatu yang lain - seperti server Anda terbakar secara spontan atau bug lain dalam kode Anda. Artinya, anggap unik dan jangan membuat kode apa pun untuk "menangkap" duplikat - gunakan waktu Anda untuk sesuatu yang lebih mungkin terjadi (yaitu hal lain).

Saya berusaha untuk menggambarkan kegunaan GUID untuk audiens blog saya (anggota keluarga non-teknis). Dari sana (melalui Wikipedia), kemungkinan menghasilkan GUID duplikat:

  • 1 dalam 2 ^ 128
  • 1 dari 340 undecillion (jangan khawatir, undecillion tidak ada di kuis)
  • 1 dalam 3,4 × 10 ^ 38
  • 1 dalam 340.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000

1
Sebenarnya, saya tidak setuju tentang 'tidak khawatir tentang hal itu', meskipun dari sikap yang berbeda: jika Anda mendeteksi tabrakan GUID, maka ada yang salah dengan aplikasi Anda. Saya telah menggunakan GUID, misalnya, untuk idempotensi, dan telah mengalami tabrakan ketika sebuah perintah telah dikirim dua kali (dengan GUID yang sama).
Kenny Hung

9

Sepertinya tidak ada yang menyebutkan matematika aktual dari kemungkinan itu terjadi.

Pertama, mari kita asumsikan kita dapat menggunakan seluruh ruang 128 bit (Guid v4 hanya menggunakan 122 bit).

Kita tahu bahwa probabilitas umum untuk TIDAK mendapatkan duplikat dalam npengambilan adalah:

(1-1 / 2 128 ) (1-2 / 2 128 ) ... (1- (n-1) / 2 128 )

Karena 2 128 jauh lebih besar daripada n, kita dapat memperkirakan ini untuk:

(1-1 / 2 128 ) n (n-1) / 2

Dan karena kita dapat mengasumsikan njauh lebih besar dari 0, kita dapat memperkirakan bahwa untuk:

(1-1 / 2 128 ) n ^ 2/2

Sekarang kita dapat menyamakan ini dengan probabilitas "dapat diterima", katakanlah 1%:

(1-1 / 2 128 ) n ^ 2/2 = 0,01

Yang kami pecahkan ndan dapatkan:

n = sqrt (2 * log 0,01 / log (1-1 / 2 128 ))

Yang menjadi Wolfram Alpha menjadi 5.598318 × 10 19

Untuk memasukkan angka itu ke dalam perspektif, mari kita ambil 10.000 mesin, masing-masing memiliki CPU 4 inti, melakukan 4Ghz dan menghabiskan 10.000 siklus untuk menghasilkan Guid dan tidak melakukan hal lain. Itu akan memakan waktu ~ 111 tahun sebelum mereka menghasilkan duplikat.


Saya telah mengedit posting Anda setelah posting ini - harap edit jika saya melakukan kesalahan;).
shA.t

Hai @ Cin, saya memiliki kekuatan untuk mengedit respons Anda tetapi memilih untuk tidak melakukannya karena saya ingin mendapatkan kesempatan bagi Anda untuk membantahnya terlebih dahulu, saya mungkin akan datang dalam sebulan-ish untuk secara resmi mengubahnya jika saya tidak t mendengar dari Anda. Saya cukup yakin matematika Anda salah. persamaan nyata untuk menentukan peluang 1% adalah ini: ((2 ^ 128 - 1) / 2 ^ 128) ^ ((n (n-1)) / 2) = 0,01. Eksponen Anda salah. bukan hanya n. Anda perlu C (n, 2) (alias (n * (n-1)) / 2) untuk menghitung semua kombinasi saat Anda menghasilkan "n" guids. Lihat di sini untuk informasi lebih lanjut
viggity

Terima kasih Cine, saya juga akhirnya mendekati n ^
2/2

Butuh 10.000 mesin 111 tahun untuk menghasilkan setiap GUID yang mungkin, dan kemudian menghasilkan duplikat. Namun, duplikat akan terjadi jauh sebelum semua GUID yang mungkin telah dihasilkan. Saya pikir perkiraan kerangka waktu akan tergantung pada seberapa 'acak' proses pembuatan GUID.
George K

@ GeorgeK Saya pikir Anda salah paham ... Diperlukan 10.000 mesin 111 tahun untuk memiliki peluang 1% menghadapi duplikat. Tapi ya, tentu saja matematika ini mengasumsikan bahwa generator acak benar-benar acak.
Cine

7

Dari http://www.guidgenerator.com/online-guid-generator.aspx

Apa itu GUID?

GUID (atau UUID) adalah akronim untuk 'Pengidentifikasi Unik Global' (atau 'Pengidentifikasi Unik Global'). Ini adalah angka integer 128-bit yang digunakan untuk mengidentifikasi sumber daya. Istilah GUID umumnya digunakan oleh pengembang yang bekerja dengan teknologi Microsoft, sedangkan UUID digunakan di tempat lain.

Seberapa unik GUID?

128-bit cukup besar dan algoritma pembangkitan cukup unik sehingga jika 1.000.000.000 GUID per detik dihasilkan selama 1 tahun, kemungkinan duplikat hanya 50%. Atau jika setiap manusia di Bumi menghasilkan 600.000.000 GUID hanya akan ada kemungkinan 50% dari duplikat.


7
bukankah kemungkinan 50% duplikat cukup tinggi untuk menimbulkan rasa takut?
disklosr

1
@ Disklosr ya cukup membuat takut jika sistem Anda menghasilkan 1 miliar GUID per detik. Dalam hal yang sangat tidak mungkin Anda menghasilkan jumlah itu maka hanya rantai dua GUID bersama-sama ...
maxshuty

5

Saya mengalami GUID duplikat.

Saya menggunakan pemindai desktop Penerimaan Rapi dan dilengkapi dengan perangkat lunak basis data berpemilik. Perangkat lunak ini memiliki fitur sinkronisasi ke cloud, dan saya terus mendapatkan kesalahan setelah sinkronisasi. Melihat sebentar log mengungkapkan garis yang luar biasa:

"errors": [{"code": 1, "message": "creator_guid: sudah diambil", "guid": "C83E5734-D77A-4B09-B8C1-9623CAC7B167"}]}

Saya agak tidak percaya, tetapi tentu saja cukup, ketika saya menemukan jalan ke database lokal saya yang rapi dan menghapus catatan yang berisi GUID itu, kesalahan itu berhenti terjadi.

Jadi untuk menjawab pertanyaan Anda dengan bukti anekdotal, tidak. Duplikat dimungkinkan. Tetapi kemungkinan alasan mengapa itu terjadi bukan karena kebetulan, tetapi karena praktik standar tidak dipatuhi. (Aku hanya tidak seberuntung itu) Namun, aku tidak bisa mengatakan dengan pasti. Itu bukan perangkat lunak saya.

Dukungan pelanggan mereka sangat sopan dan membantu, tetapi mereka pasti belum pernah mengalami masalah ini sebelumnya karena setelah 3+ jam di telepon dengan mereka, mereka tidak menemukan solusinya. (FWIW, saya sangat terkesan dengan Rapi, dan kesalahan ini, betapapun membuat frustrasi, tidak mengubah pendapat saya tentang produk mereka.)


19
Jangan percaya Anda mendapat duplikat. Mungkin ada hal lain yang terlibat, seperti angka yang tidak benar-benar acak atau masalah dalam proses sinkronisasi, atau sistem mencoba merekam dua kali, dll. Masalah perangkat lunak jauh lebih mungkin daripada Anda mendapatkan duplikat GUID.
orad

4

MSDN :

Ada kemungkinan yang sangat rendah bahwa nilai Guid baru semuanya nol atau sama dengan Guid lainnya.


4

Jika jam sistem Anda diatur dengan benar dan belum dibungkus, dan jika NIC Anda memiliki MAC sendiri (yaitu Anda belum menetapkan MAC kustom) dan vendor NIC Anda belum mendaur ulang MAC (yang seharusnya tidak dilakukan oleh mereka) tetapi yang telah diketahui terjadi), dan jika fungsi pembuatan GUID sistem Anda diimplementasikan dengan benar, maka sistem Anda tidak akan pernah menghasilkan duplikat GUID.

Jika semua orang di dunia yang membuat GUID mengikuti aturan-aturan itu maka GUID Anda akan menjadi unik secara global.

Dalam praktiknya, jumlah orang yang melanggar aturan rendah, dan GUID mereka tidak mungkin "melarikan diri". Konflik tidak mungkin secara statistik.


11
Ini hanya berlaku untuk panduan v1. The v4, yang merupakan STD de facto tidak lagi menggunakan alamat Mac tetapi nomor acak palsu.
Pita.O

1
"maka sistem Anda tidak akan pernah menghasilkan GUID duplikat" Bahkan jika semua aturan diikuti untuk panduan v1 seperti yang Anda katakan, sistem Anda masih bisa menghasilkan duplikat. Anda lebih benar di bagian bawah ketika Anda menyatakan "Konflik tidak mungkin secara statistik."
Nick Meldrum

3

Apakah GUID unik 100% dari waktu?

Tidak dijamin, karena ada beberapa cara menghasilkannya. Namun, Anda dapat mencoba untuk menghitung peluang menciptakan dua GUIDs yang identik dan Anda mendapatkan ide: GUID memiliki 128 bit, maka, ada 2 128 GUID yang berbeda - jauh lebih dari ada bintang di alam semesta. Baca artikel wikipedia untuk lebih jelasnya.


2

Dalam arti yang lebih umum, ini dikenal sebagai "masalah ulang tahun" atau "paradoks ulang tahun". Wikipedia memiliki gambaran yang cukup bagus di: Wikipedia - Masalah Ulang Tahun

Dalam istilah yang sangat kasar, akar kuadrat dari ukuran kumpulan adalah perkiraan kasar ketika Anda dapat mengharapkan 50% kemungkinan duplikat. Artikel ini menyertakan tabel probabilitas ukuran kumpulan dan berbagai probabilitas, termasuk baris untuk 2 ^ 128. Jadi untuk kemungkinan tabrakan 1% Anda akan berharap untuk secara acak memilih angka 2,6 * 10 ^ 18 128-bit. Peluang 50% membutuhkan pengambilan 2.2 * 10 ^ 19, sedangkan SQRT (2 ^ 128) adalah 1.8 * 10 ^ 19.

Tentu saja, itu hanya kasus ideal dari proses yang benar-benar acak. Seperti yang disebutkan lainnya, banyak yang menggunakan aspek acak itu - seberapa bagus generator dan seed-nya? Akan lebih baik jika ada beberapa dukungan perangkat keras untuk membantu proses ini yang akan lebih tahan peluru kecuali bahwa apa pun dapat dipalsukan atau divirtualisasi. Saya menduga itu mungkin menjadi alasan mengapa alamat MAC / stempel waktu tidak lagi dimasukkan.


Saya pikir masalah MAC adalah anonimitas. Saya percaya menggunakan pengenal seperti alamat MAC dengan cara yang bisa dibalik adalah masalah privasi. Saya percaya benar acak dalam perangkat keras sangat sulit? Cloudflare menggunakan kamera dan deretan lampu lava, namun saya pikir dengan pemahaman fisika yang tepat, bahkan itu tidak acak? Lampu lava Cloudflares RNG: popularmechanics.com/technology/security/news/a28921/…
Jeff Block

2

Untuk hasil yang lebih baik, cara terbaik adalah menambahkan GUID dengan stempel waktu (Hanya untuk memastikan bahwa itu tetap unik)

Guid.NewGuid().ToString() + DateTime.Now.ToString();

Bagaimana jika Anda mendapatkan dua tabrakan di detik yang sama?
Wai Ha Lee

Itu kasus terburuk tetapi tetap saja, kita tidak dapat memiliki dua Guid yang sama dihasilkan pada saat yang sama.
Adithya Sai

Di suatu tempat mereka berdebat, bahwa seseorang harus menyalin dari jawaban pada SO, bukan pertanyaan, tetapi saya tidak begitu yakin sekarang ....
Marcel

Bagaimana dengan Guid.NewGuid (). ToString (). Ganti ("-", "") + DateTime.Now.Ticks .... Tidak dipertanyakan tentang keunikan dan dapat digunakan sebagai kunci utama
d-coder

1

Algoritma GUID biasanya diimplementasikan sesuai dengan spesifikasi GUID v4, yang pada dasarnya adalah string pseudo-acak. Sayangnya, ini termasuk dalam kategori "kemungkinan tidak unik" , dari Wikipedia (saya tidak tahu mengapa begitu banyak orang mengabaikan bit ini): "... versi GUID lainnya memiliki sifat dan probabilitas keunikan yang berbeda, mulai dari keunikan yang dijamin kemungkinan non-keunikan. "

Sifat pseudo-acak dari JavaScript V8 Math.random()adalah MENGERIKAN di keunikan, dengan tabrakan sering terjadi setelah hanya beberapa ribu iterasi, tetapi V8 bukan satu-satunya penyebab. Saya telah melihat tabrakan GUID di dunia nyata menggunakan implementasi PHP dan Ruby dari GUID v4.

Karena semakin umum untuk skala pembuatan ID di beberapa klien, dan kelompok server, entropi mendapat untung besar - kemungkinan seed acak yang sama digunakan untuk menghasilkan ID meningkat (waktu sering digunakan sebagai seed acak di generator pseudo-acak), dan tabrakan GUID meningkat dari "kemungkinan tidak unik" menjadi "sangat mungkin menyebabkan banyak masalah".

Untuk mengatasi masalah ini, saya mulai membuat algoritma ID yang dapat mengukur dengan aman, dan membuat jaminan yang lebih baik terhadap tabrakan. Itu melakukannya dengan menggunakan cap waktu, penghitung klien dalam memori, sidik jari klien, dan karakter acak. Kombinasi faktor menciptakan kompleksitas aditif yang sangat tahan terhadap benturan, bahkan jika Anda menskalakannya di sejumlah host:

http://usecuid.org/


1

Saya telah mengalami GUID tidak unik selama multi-threaded / multi-proses unit-testing (juga?). Saya kira itu ada hubungannya dengan, semua nada yang lain sama, penyemaian identik (atau kurang penyemaian) generator acak semu. Saya menggunakannya untuk menghasilkan nama file yang unik. Saya menemukan OS jauh lebih baik dalam melakukan itu :)

Peringatan troll

Anda bertanya apakah GUID 100% unik. Itu tergantung pada jumlah GUID yang harus unik di antara. Karena jumlah GUID mendekati tak terhingga, probabilitas untuk duplikat GUID mendekati 100%.


1

Jawaban "Apakah GUID 100% unik?" hanyalah "Tidak" .

  • Jika Anda ingin 100% keunikan GUID maka lakukan hal berikut.

    1. menghasilkan GUID
    2. periksa apakah GUID itu Ada di kolom tabel Anda tempat Anda mencari keunikan
    3. jika ada maka goto langkah 1 atau langkah 4
    4. gunakan GUID ini sebagai unik.

Ini tidak membuatnya unik. Algoritme Anda tidak menyimpan GUID yang baru dibuat dalam tabel. Lain kali Anda membuat GUID, itu bisa bertabrakan dengan sebelumnya. Jika Anda memasukkan GUID ke tabel, GUID sudah bisa dimasukkan oleh rekan lain di antara Anda memeriksa keunikan dan Anda memasukkan GUID ke dalam tabel. GUID hanya unik dalam sistem ANDA, jadi jika Anda mengimpor atau menggabungkan dua basis data, mereka masih bisa bertabrakan. GUID juga sering digunakan ketika Anda tidak memiliki akses ke database terpusat. Jika Anda punya mengapa tidak hanya menarik ID dari database?
Jogge

0

Bagian tersulit bukanlah tentang menghasilkan Panduan yang terduplikasi.

Bagian tersulit adalah merancang database untuk menyimpan semua yang dihasilkan untuk memeriksa apakah itu benar-benar digandakan.

Dari WIKI:

Misalnya, jumlah UUID versi 4 acak yang perlu dibuat agar memiliki probabilitas 50% dari setidaknya satu tabrakan adalah 2,71 triliun, dihitung sebagai berikut:

masukkan deskripsi gambar di sini

Jumlah ini setara dengan menghasilkan 1 miliar UUID per detik selama sekitar 85 tahun, dan file yang mengandung banyak UUID ini, dengan 16 byte per UUID, akan menjadi sekitar 45 exabytes, beberapa kali lebih besar dari database terbesar saat ini yang ada, yang ada di urutan ratusan petabyte


0

GUID adalah singkatan dari Global Unique Identifier

Singkat: (petunjuknya ada di nama)

Secara Detail: GUID dirancang untuk menjadi unik; mereka dihitung dengan menggunakan metode acak berdasarkan jam komputer dan komputer itu sendiri, jika Anda membuat banyak GUID pada milidetik yang sama pada mesin yang sama adalah mungkin mereka cocok tetapi untuk hampir semua operasi normal mereka harus dianggap unik.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.