GUID zamanın% 100'ü benzersiz mi?
Birden fazla iş parçacığı üzerinde benzersiz kalacak mı?
GUID zamanın% 100'ü benzersiz mi?
Birden fazla iş parçacığı üzerinde benzersiz kalacak mı?
Yanıtlar:
Ü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/
2^128
yazı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.
Aynı GUID değerlerinden korkuyorsanız, bunlardan ikisini yan yana koyun.
Guid.NewGuid().ToString() + Guid.NewGuid().ToString();
Çok paranoyaksanız, üç tane koyun.
999999999
Formunuzdaki 9 9'dan sonra , Paranoia'nın Tarayıcımı patlatacağını düşünüyorum.
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 :-)
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.
msiexec
kaldı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;)
0FF1CE
GUID'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.
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.
Guid.NewGuid
her zaman v4 GUID'leri üretir (ve her zaman vardır). Tim çok zayıf entropi kaynaklarına sahip olmalıydı.
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
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?
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.
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ığı:
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 n
bunu yaklaşık olarak yapabiliriz:
(1-1 / 2212 ) n (n-1) / 2
Ve n
0'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 n
ve 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.
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.
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.)
MSDN :
Yeni Rehber'in değerinin tamamen sıfır veya diğer Rehberlere eşit olma ihtimali çok düşüktür.
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.
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 .
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.
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();
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:
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 :)
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.
Ait cevap "bir GUID% 100 tektir mı?" sadece "Hayır" dır .
% 100 GUID benzersizliği istiyorsanız, aşağıdakileri yapın.
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ı
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.