GUID zamanın% 100'ü benzersiz mi?


519

GUID zamanın% 100'ü benzersiz mi?

Birden fazla iş parçacığı üzerinde benzersiz kalacak mı?


264
Hayır,% 100 değil ... Sadece 99,999999999999999999999999999999999999999999999999999999999999999999999999999%;;
JohannesH

52
Her şeyden önce, bir GUID sonsuz değildir, bu da "zamanın% 100'ünün" gerçek anlamı için, GUID'leri üretmeye ne kadar devam ederseniz sürün, her zaman benzersiz olacağı anlamına gelir. Olay bu değil. Ayrıca, anahtar kartının bir kısmını üretmek için ağ kartı benzersiz seri / id / MAC'nin kullanıldığı orijinal uygulama artık çeşitli nedenlerle kullanılmadığından, bir GUID artık gerçekten global olarak benzersiz değildir . Ancak, yerel olarak benzersizdir. Başka bir deyişle, tek bir makinede GUID oluşturmaya devam ederseniz, kopya almazsınız.
Lasse V. Karlsen

36
@ojrac Ben sadece aşağı yuvarlamak ...: P
JohannesH

403
GUID'i her oluşturduğumda Evrenden bir tane çalıyormuşum gibi hissediyorum. Bazen ihtiyaç duyduklarından çok daha fazla GUID üreten kötü insanlar hakkında düşünüyorum ve bu boşa GUID'ler çok yalnız kullanılmaz veya tekrar üretilmez ...
asavartsov

29
@asavartsov Bence wasteaguid.info hoşuna gidecek ^ _ ^
Navin

Yanıtlar:


431

Üretilen her GUID'in benzersiz olduğu garanti edilmese de, toplam benzersiz anahtar sayısı (2 128 veya 3.4 × 10 38 ) o kadar büyüktür ki aynı sayının iki kez üretilme olasılığı çok azdır. Örneğin, yaklaşık 5 × 10 22 yıldız içeren gözlemlenebilir evreni düşünün ; daha sonra her yıldızın evrensel olarak benzersiz GUID'leri 6.8 × 10 15 olabilir .

Gönderen Wikipedia .


Bunlar (GU için) bir GUID nasıl yapılır ve doğru durumda aynı rehber nasıl alabilirim hakkında bazı iyi makalelerdir.

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
O halde UUID olarak adlandırılmayacaklar mı? ;)
Arafangion

28
GUID, microsoft'un UUID standardının spesifik uygulamasıdır. Yani, ikisi de. Evrensel benzersiz kimlik vs Evrensel benzersiz kimlik.
Adam Davis

40
Teknik olarak, 2 ^ 128 değildir, çünkü bir v4 GUID'de, her zaman 4 (etkili bir şekilde 4 bit kaldırma) olacak bir onaltılık basamağınız vardır ve iki bit daha ayrılmıştır. Ancak, 2 ^ 122 geçerli V4 GUID'leri hala benim için yapacak olan yaklaşık 5x10 ^ 36 bırakır. ve senin için de. Her yıldızın yalnızca yaklaşık 1.1x10 ^ 14 GUID değerini kabul etmesi gerekir.
Andrew Shelansky

67
Eğer benim gibi iseniz, o zaman 2^128yazılı olarak yaklaşık olduğunu bilmek istersiniz 34,028,236,692,093,846,346,337,460,743,177,000,000. İstatistiksel olarak, her saniyede 1000 GUID hesapladıysanız, yinelenmesi trilyonlarca yıl sürecektir.
Varlık

26
Sadece okumak için komik olduğunu düşündüm bu yüzden burada çocuklar var :) Otuz dört undecillion yirmi sekiz milyon iki yüz otuz altı nonillion altı yüz doksan iki octillion doksan üç septillion sekiz yüz kırk altı sextillion üç yüz kırk altı quintillion üç yüz otuz yedi quadrillion dört yüz altmış trilyon yedi yüz kırk üç milyar yüz yetmiş yedi milyon
hjavaher

85

Aynı GUID değerlerinden korkuyorsanız, bunlardan ikisini yan yana koyun.

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

Çok paranoyaksanız, üç tane koyun.


64
3 GUID eklemek için çok, çok, çok, çok paranoyak olmalısınız.
harsimranb

25
@harsimranb Hayır ... çok, çok, çok, çok paranoyak 6 GUID'dir. Paranoyak bir ekli, çok paranoyak iki ekli, vb.
Suamere

37
@Suamere Paranoyak seviyenizi hesaplamak için bir web sitesi hazırladım jogge.github.io/HowParanoidAmI
Jogge

3
@Jogge xD Bu harika, lol. 999999999Formunuzdaki 9 9'dan sonra , Paranoia'nın Tarayıcımı patlatacağını düşünüyorum.
Suamere

66

Basit cevap evet.

Raymond Chen , GUID'ler ve GUID'lerin alt dizelerinin neden benzersiz garanti edilmediğine dair harika bir makale yazdı . Makale, GUID'lerin oluşturulma şekli ve benzersizliği sağlamak için kullandıkları veriler, neden olduklarını açıklamak için biraz uzun sürmesi gereken derinlik kazanıyor :-)


23
Chen'in makalesi, MAC adresi ve zaman damgası kullanan GUID oluşturma algoritmasının V1'ine atıfta bulunuyor - mevcut V4 bunun yerine sözde rastgele bir sayı kullanıyor: en.wikipedia.org/wiki/Globally_Unique_Identifier#Algorithm
Barrett

2
bağlantı öldü - 403 Yasak
daya


39

Bir yan not olarak, Windows XP'de Volume GUID'lerle oynuyordum. Bu, üç disk ve on dört birim içeren çok belirsiz bir bölüm düzenidir.

\\?\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

GUID'lerin çok benzer olması değil, tüm GUID'lerin içinde "mario" dizesi olması gerçeği. Bu bir tesadüf mü yoksa arkasında bir açıklama var mı?

Şimdi, GUID'de bölüm 4 için googling yaparken hacim GUID'leri ile yaklaşık 125.000 hit buldum.

Sonuç: Birim GUID'leri söz konusu olduğunda, diğer GUID'ler kadar benzersiz değildir.


31
80'lerden Süper Mario Bros 3 reklamı hatırlıyor musunuz? Bütün o insanlar "Mario! Mario! Mario!" dünyadaki evrenin rastgeleliğini biraz altüst etti.
MGOwen

24
Office 2010'u el ile msiexeckaldırırsanız, ofis programının tüm MSI GUID'lerini listeler. Hepsi heceliyor 0FF1CE. Microsoft'un bir GUID'nin nasıl oluşturulacağına dair oldukça ... gevşek ... bir yorumu var gibi görünüyor;)
Mark Henderson

3
Bu bölüm GUID'lerinin tümü 2009-12-17 @ 14:47:45 UTC'de birlikte oluşturuldu. Bunlar makinenize özgüdür, ancak düğüm tanımlayıcısı yanlış olarak "mario" koymak - RFC-4122 uyumlu olmadıkları anlamına gelir. Benzer şekilde, 0FF1CEGUID'ler RFC-4122'nin "NCS geriye doğru uyumluluk" bölümü altına girer, ancak Microsoft'un bu değerler için NCS kurallarını izlemesi olası değildir.
Stephen Cleary

16
Bunu biliyordum, Nintendo Güvenlik İdaresi rasgele sayı üreteçlerinden ödün verdi.
MetaGuru

1
belki de maden suyu üreten şirketin adı ile aynı top parkıdır. Geriye doğru yazılan Naif :-)
Mariusz

31

Olmamalı. Ancak, .NET yoğun bir yük altında olduğunda, yinelenen kılavuzlar almak mümkündür. İki farklı sql sunucusu kullanan iki farklı web sunucum var. Verileri birleştirmeye gittim ve 15 milyon rehberim ve 7 kopyam olduğunu gördüm.


1
Bu iki farklı makinede nasıl mümkün olabilir? GUID'in bir kısmının makine adı olduğunu düşündüm. (tartışmıyor ... sadece soruyorum)
John Cruz

8
Bu yalnızca GUID oluşturma işleminin bir parçası olarak MAC adreslerini (makine adını değil) kullanan v1 kılavuzları için geçerlidir. Fiili STD olan v4 artık Mac adreslerini değil, sahte bir rasgele sayı kullanıyor.
Xander

14
Guid.NewGuidher zaman v4 GUID'leri üretir (ve her zaman vardır). Tim çok zayıf entropi kaynaklarına sahip olmalıydı.
Stephen Cleary

1
Bu hiç kopyalandı mı? durum böyleyse çok büyük bir problemdir.
Zyo

1
Çok büyük Veri Kümelerini İçe Aktarırken de aynı şey geçerlidir. 10-100 Milyon civarında, Guid.NewGuid
Stephan

28

Evet, bir GUID her zaman benzersiz olmalıdır. Hem donanım hem de zamana ve benzersiz olduğundan emin olmak için birkaç ekstra bite dayanır. Eminim teorik olarak iki özdeş olanla sonuçlanmak mümkündür, ancak gerçek dünya senaryosunda son derece olası değildir.

Raymond Chen tarafından Guids hakkında harika bir makale:

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


5
Bu makale oldukça eskidir ve GUID'lerin v1'ine atıfta bulunmaktadır. v4 donanım / zaman değil, rastgele bir sayı algoritması kullanır. en.wikipedia.org/wiki/Globally_unique_identifier#Algoritma
Mani Gandham

Bu bağlantı koptu
Marcel


23

Kılavuzlar istatistiksel olarak benzersizdir. Aynı Rehber'i üreten iki farklı müşterinin olasılığı son derece küçüktür (Kılavuz oluşturma kodunda hiçbir hata olmadığı varsayılır). Bir kozmik ışın nedeniyle işlemcinizin hata yapması ve bugün 2 + 2 = 5 olduğuna karar vermenizden de endişe edebilirsiniz.

Yeni kılavuzlar ayıran birden fazla iş parçacığı benzersiz değerler elde eder, ancak aradığınız işlevin iş parçacığı için güvenli olduğunu anlamalısınız. Bu hangi ortamda?


19

Eric Lippert GUID'ler hakkında çok ilginç makaleler dizisi yazdı.

Dünyada siparişte 2 30 kişisel bilgisayar var (ve elbette aynı düzeydeki hesaplama gücüne sahip veya daha az seviyeye sahip olan, ancak bunları görmezden gelmeye izin veren birçok el cihazı veya PC dışı bilgi işlem cihazı). Dünyadaki tüm PC'leri GUID oluşturma görevine koyduğumuzu varsayalım; Her biri üretebilir eğer, 2, demek 20 saniye sonra sonra sadece 2 yaklaşık başına Guıd'lerini 72 - saniye 150000000000000 yıl - Bir gerekecek çok yüksek özel GUID ile bir çarpışma üretme şansı. Ve çarpışma ihtimali sadece otuz trilyon yıl sonra oldukça iyi.


28
... ve bir sonraki paragrafta da devam ediyor: "Ama bu belirli bir GUID ile çarpışma arıyor. [...] Bu yüzden bu milyar PC'yi 122 bitlik rastgele rasgele GUID'ler üretmeye çalışırsak, yaklaşık 2 ^ 61 GUID oluşturulduktan sonra orada bir yerde çarpışan iki kişi gerçekten yüksek olur.Yaklaşık 2 ^ 30 makinenin saniyede 2 ^ 20 GUID yaptığını varsaydığımızdan, yaklaşık 2 ^ 11 saniye, ki bu yaklaşık bir saat . " (Ve son olarak, elbette, pek çok GUID'nin üretilmediğini açıklıyor.)
Arjan

16

Teorik olarak, hayır, benzersiz değiller. Tekrar tekrar özdeş bir rehber oluşturmak mümkündür. Ancak, gerçekleşme şansı o kadar düşük ki, benzersiz olduklarını varsayabilirsiniz.

Daha önce okudum şansı o kadar düşük ki gerçekten başka bir şey hakkında stres gerekir - sunucunuz kendiliğinden yanıcı veya kodunuzdaki diğer hatalar gibi. Yani, benzersiz olduğunu varsayalım ve kopyaları "yakalamak" için herhangi bir kod oluşturmayın - daha olası bir şey (örneğin başka bir şey) için zaman harcayın .

Ben bir girişimde bloguma izleyici (teknik olmayan aile memebers) Guıd için yararlılığını açıklamak için. Oradan (Wikipedia aracılığıyla), yinelenen bir GUID oluşturma olasılığı:

  • 2'de 1 ^ 128
  • 340 undecillion'da 1 (endişelenmeyin, undecillion sınavda değil)
  • 3,4 × 10 ^ 38 inç
  • 340.000.000.000.000.000.000.000.000.000.000.000.000'da 1

1
Aslında, farklı bir duruştan dolayı 'endişelenmeme' konusunda katılmıyorum: Bir GUID çarpışması tespit ederseniz, uygulamanızla ilgili bir şeyler ters gitti. Örneğin, idempotency için GUID kullandım ve bir komut iki kez (aynı GUID ile) gönderildiğinde bir çarpışma var.
Kenny Hung

9

Hiçbiri, gerçekleşme olasılığının gerçek matematiğinden bahsetmiyor gibi görünüyor.

İlk olarak, 128 bit alanın tamamını kullanabileceğimizi varsayalım (Guid v4 yalnızca 122 bit kullanır).

Seçimlerde yinelenmeme ihtimalinin genel olduğunu biliyoruz n:

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

2 128'den çok daha büyük olduğu için nbunu yaklaşık olarak yapabiliriz:

(1-1 / 2212 ) n (n-1) / 2

Ve n0'dan çok daha büyük olduğunu varsayabildiğimizden , bunu yaklaşık olarak yapabiliriz:

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

Şimdi bunu "kabul edilebilir" olasılığa eşitleyebiliriz, diyelim% 1:

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

Hangi için çözmek nve olsun:

n = sqrt (2 * log 0.01 / log (1-1 / 2 128 ))

Hangi Wolfram Alpha 5,598318 × 10 19 olur

Bu sayıyı perspektife sokmak için, her biri 4 çekirdekli CPU'ya sahip olan, 4Ghz yapan ve 10000 döngü harcayarak bir Rehber oluşturmak ve başka bir şey yapmamak için 10000 makine alalım. Daha sonra bir kopya oluşturmaları yaklaşık 111 yıl alır.


Ben aşağıdaki yayınınızı düzenlediğiniz bu yazı - Bir hata yaptım düzenlemek eğer lütfen).
shA.t

Merhaba @Cine, yanıtınızı düzenleme gücüne sahibim, ancak seçmediniz çünkü önce reddetmeniz için bir şans elde etmek istiyorum, muhtemelen bir ay içinde gelsem, resmi olarak değiştirmek için gelirim ' senden duymadım. Yine de matematiğinizin yanlış olduğundan eminim. % 1 şans belirlemek için gerçek denklem şudur: ((2 ^ 128 - 1) / 2 ^ 128) ^ ((n (n-1)) / 2) = .01. Üssünüz yanlış. sadece n değil "N" kılavuzları oluştururken tüm kombinasyonları hesaplamak için C (n, 2) (aka (n * (n-1)) / 2) gerekir. Daha fazla bilgi için buraya bakın
viggity

Teşekkürler Cine, ben de çok büyük beri n ^
2/2

Mümkün olan her GUID'yi oluşturmak ve daha sonra bir kopya oluşturmak için 10000 makinenin 111 yıl alması gerekir. Ancak yinelenen tüm olası GUID'ler oluşturulmadan çok önce gerçekleşir. Bence yaklaşık zaman çerçevesi GUID oluşturma sürecinin ne kadar 'rasgele' olduğuna bağlı.
George K

@GeorgeK Sanırım yanlış anladınız ... Bir kopya ile karşılaşma olasılığının% 1 olması 10000 makinenin 111 yıl sürmesini gerektiriyor. Ama evet, bu matematik matematiği rastgele jeneratörün tamamen rasgele olduğunu varsayar.
Cine

7

Gönderen http://www.guidgenerator.com/online-guid-generator.aspx

GUID nedir?

GUID (veya UUID) 'Global Benzersiz Tanımlayıcı' (veya 'Evrensel Benzersiz Tanımlayıcı') için kullanılan bir kısaltmadır. Kaynakları tanımlamak için kullanılan 128 bit tam sayıdır. GUID terimi genellikle Microsoft teknolojileriyle çalışan geliştiriciler tarafından kullanılırken, UUID başka her yerde kullanılır.

Bir GUID ne kadar benzersizdir?

128 bit yeterince büyüktür ve üretim algoritması, 1 yıl boyunca saniyede 1.000.000.000 GUID üretilirse, yinelenme olasılığının sadece% 50 olacağı kadar benzersizdir. Veya Dünya'daki her insan 600.000.000 GUID üretmiş olsaydı, sadece% 50'lik bir kopya olasılığı olurdu.


7
% 50'si korkuya neden olacak kadar yüksek bir kopya değil mi?
disklosr

1
@disklosr evet, sistemleriniz saniyede 1 milyar GUID üretiyorsa korkuya neden olmak yeterlidir. Son derece olası bir olayda bu miktarı üretiyorsunuz, sonra iki
GUID'yi

5

Yinelenen bir GUID ile karşılaştım.

Neat Receipts masaüstü tarayıcısını kullanıyorum ve tescilli veritabanı yazılımı ile birlikte geliyor. Yazılımın bulutla senkronizasyon özelliği var ve senkronizasyon üzerine hata almaya devam ettim. Günlüklerdeki bir gander, harika çizgiyi ortaya çıkardı:

"hatalar": [{"kod": 1, "mesaj": "creator_guid: zaten alınmış", "guid": "C83E5734-D77A-4B09-B8C1-9623CAC7B167"}]}

Biraz güvensizdim, ama yerel neatworks veritabanımın bir yolunu bulduğumda ve bu GUID'i içeren kaydı sildiğimde, hata oluşmayı bıraktı.

Sorunuza anekdot kanıtlarıyla cevap vermek için hayır. Bir kopya mümkündür. Ancak, bunun nedeninin tesadüf değil, standart uygulamanın bir şekilde uyulmaması nedeniyle olması muhtemeldir. (Ben sadece o kadar şanslı değilim) Ancak, kesin olarak söyleyemem. Benim yazılımım değil.

Müşteri destekleri son derece nazik ve yardımseverdi, ancak onlarla telefonda 3 saat geçtikten sonra çözümü bulamadıkları için bu sorunla daha önce hiç karşılaşmamış olmaları gerekiyordu. (FWIW, Neat'den çok etkilendim ve bu aksaklık, sinir bozucu olsa da, ürün hakkındaki fikrimi değiştirmedi.)


19
Bir kopyaya sahip olduğuna inanma. Muhtemelen başka bir şey vardı, örneğin sayı gerçekten rasgele değildi veya senkronizasyon sürecinde sorun yoktu veya sistem iki kez kaydetmeye çalıştı, vb. Bir yazılım sorunu, yinelenen bir GUID almaktan çok daha olasıdır.
orad

4

MSDN :

Yeni Rehber'in değerinin tamamen sıfır veya diğer Rehberlere eşit olma ihtimali çok düşüktür.


4

Sistem saatiniz doğru şekilde ayarlanmışsa ve etrafına sarılmamışsa ve NIC'iniz kendi MAC'ine sahipse (yani özel bir MAC ayarlamadıysanız) ve NIC satıcınız MAC'ları geri dönüştürmediyse ( ancak bunun gerçekleştiği bilinmektedir) ve sisteminizin GUID oluşturma işlevi düzgün bir şekilde uygulandıysa, sisteminiz asla yinelenen GUID'ler oluşturmaz.

Yeryüzünde GUID üreten herkes bu kurallara uyarsa, GUID'leriniz genel olarak benzersiz olacaktır.

Uygulamada, kuralları ihlal eden kişi sayısı düşüktür ve GUID'lerinin "kaçması" muhtemel değildir. Çatışmalar istatistiksel olarak imkansızdır.


11
Bu sadece v1 kılavuzları için geçerlidir. Fiili STD olan v4 artık Mac adreslerini değil, sahte bir rasgele sayı kullanıyor.
Pide.O

1
"o zaman sisteminiz asla yinelenen GUID'ler oluşturmaz" Dediğiniz gibi bir v1 kılavuzu için tüm kurallara uyulsa bile, sisteminiz yine de kopyalar oluşturabilir. "Çatışmalar istatistiksel olarak olanaksızdır" ifadesini kullandığınızda en altta daha doğru olursunuz.
Nick Meldrum

3

GUID zamanın% 100'ü benzersiz mi?

Garantili değil, çünkü bir tane oluşturmanın birkaç yolu var. Ancak, aynı olan iki GUID oluşturma şansını hesaplamayı deneyebilirsiniz ve bir fikir elde edersiniz: GUID'in 128 biti vardır, bu nedenle, 2 128 farklı GUID vardır - bilinen evrende yıldızlardan çok daha fazlası. Daha fazla bilgi için wikipedia makalesini okuyun .


2

Daha genel anlamda, bu "doğum günü sorunu" veya "doğum günü paradoksu" olarak bilinir. Wikipedia'da oldukça iyi bir genel bakış var: Wikipedia - Doğum Günü Sorunu

Çok kaba terimlerle, havuzun büyüklüğünün kare kökü,% 50 çoğaltma şansı beklediğinizde kabaca yaklaşık bir yaklaşımdır. Makale, havuz büyüklüğü ve 2 ^ 128 için bir satır dahil olmak üzere çeşitli olasılıklar içeren bir olasılık tablosu içerir. Bu nedenle,% 1'lik bir çarpışma olasılığı için rasgele 2.6 * 10 ^ 18 128-bit sayıları seçmeyi beklersiniz. 50% şans 2.2 * 10 ^ 19 alırken, SQRT (2 ^ 128) 1.8 * 10 ^ 19.

Tabii ki, bu gerçekten rastgele bir sürecin ideal örneği. Diğerlerinin de belirttiği gibi, bu rastgele yön üzerinde çok şey var - jeneratör ve tohum ne kadar iyi? Bu işleme yardımcı olacak ve herhangi bir şeyin sahte veya sanallaştırılabilmesi dışında daha fazla kurşun geçirmez olacak bazı donanım desteği varsa iyi olurdu. MAC adreslerinin / zaman damgalarının artık dahil edilmemesinin nedeni olabileceğinden şüpheleniyorum.


MAC sorununun anonimlik olduğunu düşünüyorum. MAC adresi gibi bir tanımlayıcıyı tersine çevrilebilecek bir şekilde kullanmanın bir gizlilik sorunu olduğuna inanıyorum. Donanımda gerçek rastgele çok zor olduğuna inanıyorum? Cloudflare bir kamera ve bir dizi lav lambası kullanıyor, ancak fizikte kesin bir anlayışla, bu bile rastgele değil mi? CloudFlare Lav lambası RNG: popularmechanics.com/technology/security/news/a28921/...
Jeff Blok

2

Daha iyi sonuç için en iyi yol GUID'i zaman damgasına eklemektir (Sadece benzersiz kaldığından emin olmak için)

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

Aynı saniyede iki çarpışma olursa?
Wai Ha Lee

Bu en kötü durum ama yine de aynı iki Guid'i aynı anda üretemiyoruz.
Adithya Sai

Bir yerlerde, soruya değil SO'nun cevabından kopyalanması gerektiğini savunuyorlar, ama şimdi o kadar emin değilim ....
Marcel

Guid.NewGuid (). ToString (). Değiştirin ("-", "") + DateTime.Now.Ticks .... Benzersizlik hakkında şüpheli değil ve birincil anahtar olarak kullanılabilir
d-kodlayıcı

1

GUID algoritmaları genellikle temelde sahte rastgele bir dize olan v4 GUID spesifikasyonuna göre uygulanır. Ne yazık ki, bunlar Wikipedia'dan "muhtemelen benzersiz olmayan" kategorisine giriyor (neden bu kadar çok insanın bu şeyi görmezden geldiğini bilmiyorum): "... diğer GUID sürümleri, garantili benzersizlikten farklı benzersiz özellik ve olasılıklara sahip büyük olasılıkla benzersiz olmamaya. "

V8'in JavaScript'in sözde rastgele özellikleri Math.random(), KORKUNÇDUR, tek başına KORKUNÇ, çarpışmalar genellikle sadece birkaç bin yinelemeden sonra geliyor, ancak V8 tek suçlu değil. V4 GUID'lerin hem PHP hem de Ruby uygulamalarını kullanarak gerçek dünya GUID çarpışmalarını gördüm.

Birden çok istemcide ve sunucu kümelerinde kimlik üretimini ölçeklendirmek gittikçe yaygınlaştığından entropi büyük bir darbe alıyor - kimlik tespiti yapmak için kullanılan aynı rastgele tohumun şansı (zaman genellikle rastgele bir tohum olarak kullanılıyor) sözde rastgele üreteçlerde) ve GUID çarpışmaları "olası olmayan" durumdan "çok fazla soruna neden olma olasılığı" na yükselir.

Bu sorunu çözmek için, güvenli bir şekilde ölçeklenebilecek ve çarpışmaya karşı daha iyi garantiler verebilecek bir kimlik algoritması oluşturmaya başladım. Bunu zaman damgası, bir bellek içi istemci sayacı, istemci parmak izi ve rastgele karakterler kullanarak yapar. Faktörlerin kombinasyonu, bir dizi ana bilgisayarda ölçeklendirseniz bile, özellikle çarpışmaya karşı dirençli bir ek karmaşıklık oluşturur:

http://usecuid.org/


1

GUID'lerin çok iş parçacıklı / çok işlemli birim sınama sırasında (çok mu?) Benzersiz olmadığını gördüm. Sanırım bu, diğer tüm meselelerin eşit olmasıyla, sahte rastgele jeneratörlerin özdeş tohumlanması (veya tohumlama eksikliği) ile ilgisi var. Benzersiz dosya adları oluşturmak için kullanıyordum. Ben OS bunu çok daha iyi buldum :)

Troll uyarısı

GUID'lerin% 100 benzersiz olup olmadığını soruyorsunuz. Bu, benzersiz olması gereken GUID sayısına bağlıdır. GUID sayısı sonsuzluğa yaklaştıkça, yinelenen GUID olasılığı% 100'e yaklaşır.


1

Ait cevap "bir GUID% 100 tektir mı?" sadece "Hayır" dır .

  • % 100 GUID benzersizliği istiyorsanız, aşağıdakileri yapın.

    1. GUID oluştur
    2. benzersiz bulmaya çalıştığınız tablo sütununda GUID'in var olup olmadığını kontrol edin
    3. Varsa adım 1'e gidin, adım 4'e gidin
    4. bu GUID'i benzersiz olarak kullanın.

Bu onu benzersiz kılmaz. Algoritmanız yeni oluşturulan GUID'i tabloya kaydetmez. Bir daha GUID oluşturduğunuzda, daha önce bir GUID ile çarpışabilir. GUID'i tabloya ekleyecekseniz, GUID, aralarında benzersiz olup olmadığını denetleyen başka bir eş tarafından zaten eklenmiş olabilir ve GUID'yi tabloya eklediniz. GUID yalnızca SİZİN sisteminizde benzersizdir, bu nedenle iki veritabanını içe aktarır veya birleştirirseniz, yine de çarpışabilirler. Ayrıca GUID genellikle merkezileştirilmiş bir veritabanına erişiminiz olmadığında kullanılır. Eğer sahip olsaydınız neden sadece veritabanından bir kimlik almıyorsunuz?
Jogge

0

En zor kısım, çoğaltılan bir Rehber oluşturmakla ilgili değildir.

En zor bölüm, gerçekten çoğaltılıp çoğaltılmadığını kontrol etmek için oluşturulan tüm veritabanını saklamak için bir veritabanı tasarlanmıştır.

WIKI'den:

Örneğin, en az bir çarpışma olasılığının% 50 olması için üretilmesi gereken rastgele sürüm 4 UUID'lerin sayısı aşağıdaki şekilde hesaplanır: 2.71 quintillion:

resim açıklamasını buraya girin

Bu sayı, yaklaşık 85 yıl boyunca saniyede 1 milyar UUID oluşturmaya eşdeğerdir ve UUID başına 16 baytta bu çok sayıda UUID içeren bir dosya, şu anda var olan en büyük veritabanlarından birçok kez daha büyük olmak üzere yaklaşık 45 eksabayt olacaktır. yüzlerce petabayt sırası


0

GUID, Global Unique Identifier'ın kısaltmasıdır

Kısaca: (ipucu adında)

Ayrıntılı olarak: GUID'ler benzersiz olacak şekilde tasarlanmıştır; bilgisayar saatine ve bilgisayarın kendisine dayalı rastgele bir yöntem kullanılarak hesaplanırlar, aynı makinede aynı milisaniyede çok sayıda GUID oluşturuyorsanız, eşleşmeleri mümkündür, ancak neredeyse tüm normal işlemler için benzersiz olarak düşünülmelidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.