2010-09-18 7 views
8

Birkaç milyon GUID ürettim, onları bir String'e dönüştürdüm ve uzunluğu aldım ... her zaman aynıydı. String'e dönüştürürken GUID'in bu sabit uzunluğuna güvenebilir miyim?GUID'ler hakkında sorular: Her zaman uzunlukları sabittir ve orta sayı her zaman 4'tür?

Ayrıca, bu ekran görüntüsünde gösterildiği gibi GUID'in orta sayısı her zaman "4" mü?

alt text

+0

'a dönmesinin nedeni budur. Bu yalnızca GUID ile ilgili söylenenlere güvenebilirsiniz. Eğer spec sabit uzunlukta bir dize göstergesinden bahsetmiyorsa, ona güvenmeyin. –

+0

@Keith - Hem MS hem de OSF ile 8-4-4-4-12 formatı standarttır. MS docs Guid diyor.ToString() "Bu Guid'in değeri aşağıdaki gibi biçimlendirilmiştir: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" –

+0

Tamam, o zaman iyisiniz. –

cevap

8

Evet, uzunluk sabittir ve standart toString biçimi kullandığınızda evet orta numarası her zaman 4'tür. (neredeyse her pencere olmadığı bir UUID olarak da bilinir) GUID bit bazıları ben "4 olduğunu eklemek gerekir

http://en.wikipedia.org/wiki/Uuid

DÜZENLEME .. vb versiyonu gibi şeyleri belirtmek için sabitlenir "yalnızca, .NET'te uygulanan Guid.NewGuid algoritmasına göre oluşturulan Kılavuzlar için geçerlidir. Herhangi bir keyfi bayt [16] almanızı ve bunu Guid'e dönüştürmenizi engelleyecek hiçbir şey yoktur. Yani, algoritmanın şu anki uygulanabilmesi için sadece 4'lük bir banka olabilirsiniz. Net. Başka bir kaynaktan Guids alıyorsanız, 4 üzerinden bankaya sahip olamazsınız. Net veya olasılıkla pencereler için bir güncelleştirme (.Net'in kendi veya Windows 'jeneratörünü kullanıyorsa) GUID

'un sabit sayılarını değiştirebilir

eg (Parametre olmadan) documentation on Guid.ToString itibaren

 var rand = new Random(); 
     var byteArray = new byte[16]; 
     rand.NextBytes(byteArray); 
     var g = new Guid(byteArray); 
+1

4, sürüm numarasıdır. Nasıl oluşturulduğuna bağlı, * değil * onu bir dizeye nasıl dönüştürdüğünüz. – Gabe

+0

GUID'yi baz-10 numarası olarak görüntülediyseniz, her zaman o konumda 4 olmaz. Aklına takılırsa, bu delilik olur, sadece senin OLABİLİRSİNİZ. – mjfgates

+1

@Gabe - dize uzunluğunu kısaltmak için, yarı ortak bir hile 64 dönüşümü yapmaktır, bu durumda dize 4 konumunda olmayacak, sabit değerleri maskeleyecektir. örneğin: Convert.ToBase64String (guid.ToByteArray()); –

3

: tamamen kod çalışıyor izleyerek ve konumda 4 olmayacaktır

olarak biçimlendirilmiş bu Guid değeri aşağıdaki gibidir: XXXXXXXX -xxxx-xxxx-xxxx-xxxxxxxxxxxx GUID'nin değeri 8, 4, 4, 4, ve 12 basamaklı gruplar halinde küçük altı rakamlı bir dizi olarak tanımlanması ve kısa çizgilerle ayrılmış olan . Bir dönüş değeri örneği, "382c74c3-721d-4f34-80e5-57657b6cbc27" dir.

Yani cevabı "evet", bu hep aynı uzunlukta olacaktır.

4'e gelince, bir sürüm numarasıdır (http://en.wikipedia.org/wiki/Uuid'a göre). Bu algoritma ile oluşturduğunuz her GUID bu konumda 4'e sahip olacaktır, ancak eski GUID'lerin 1, 2 veya 3'ü olacaktır. Gelecekte olanlar 5 veya daha yüksek bir değere sahip olabilir.

2

Hayır - Bir GUID pencerelerin altında birçok GUIDs 1.

Tip 1 birincil MAC, bir saat ve bir dizi alır UUID TÜRÜ en şunlardır aslında bir tür 4 UUID olmak zorunda değildir. Bu aslında "Sızıntı" verileriyle aynı sistemde oluşturulan tüm UUID1'lerin aynı MAC'a sahip olacağıdır. Çoğu GUID işlevinin bu verileri alıp hash değerine getirip hash tabanlı bir UUID