Bir GUID'de kaç karakter vardır?


82

ASCII kodlamasını kullanarak, bir GUID'de kaç karakter vardır?

Küme parantezleri ve kısa çizgiler içeren Microsoft stiliyle ilgileniyorum.


2
Hepsi tamamen aynı uzunluktadır. Karakterleri bir tanede sayarsanız, hepsinin uzunluğunu bilirsiniz.
Greg Hewgill

1
@Greg - Uzunluğun değişmeyeceğini anlamadığınız sürece, bu çok zayıf bir varsayımdır.
Adam Davis

8
Uzunluk farklıysa, bu soru "bir ip parçası ne kadar uzunluktadır?" Bunun yerine, "bir düzinede kaç yumurta var?"
Greg Hewgill

8
Bu soruyu Google'da araştırdığımda, her cevap sadece bir rehberin tanımına işaret ediyordu. İsterseniz bana olumsuz oy verin, ancak bu özel sorunun cevabını daha kolay bulmaya çalışıyorum, gelecekteki sorucular için saymaya gerek yok.
Jim

2
Ne söylediğinizi anlıyorum, ancak birisi NewDataX ile yeni tanışmışsa, uzunluk sorusu geçerlidir ve NewDataX'in ne olduğunu anlayana kadar gördüğünüz her NewDataX'in diğer her NewDataX'i örneklediğini varsayamazsınız.
Adam Davis

Yanıtlar:


130

Gönderen MSDN :

GUID, 8 onaltılık basamaktan oluşan bir grup, ardından her biri 4 onaltılık basamaktan oluşan üç grup ve ardından 12 onaltılık basamaktan oluşan bir gruptan oluşan 128 bitlik bir değerdir. Aşağıdaki örnek GUID, bir GUID'deki onaltılık basamak gruplarını gösterir: 6B29FC40-CA47-1067-B31D-00DD010662DA

Gönderen Vikipedi :

Yukarıdaki biçimi kapsayacak şekilde genellikle parantez eklenir, örneğin:

{3F2504E0-4F89-11D3-9A0C-0305E82C3301}

Yani, kaşlı ayraçlarla tipik onaltılık kodlamada toplam 38 karakter.

-Adam


@magnifico - bu cevabın son paragrafına bakın: "Yani tipik onaltılık kodlamada kaşlı ayraçlarla toplam 38 karakter."
Randolpho

1
Magnifico ile savaşmaya gerek yok - soruyu sordu, en uygun cevabı kimin verdiğine karar verecek. Eminim diğer cevabı tercih etme nedenleri vardır.
Adam Davis

@Beska çünkü Stack Overflow bunun için. Bir kişiye bir balık vermek yerine, aynı balığı bir milyon kişiye verin.
bugloaf

@bugloaf Hmm. Her iki yorumumun da silinmiş olan bir şeye atıfta bulunduğundan şüpheleniyorum, çünkü mevcut bağlamda hiçbir anlam ifade etmediler ... ve ilki, özellikle de gitmiş olan bir şeye verilen yanıttı . Onlardan kurtuldum. (Şu anki bağlamda, cevaba karşı korkuyormuşum gibi görünüyordu, bu iyi bir cevap ve benim için hiç mantıklı gelmiyordu ve doğru şekilde sesleniyordun.)
Beska

@AdamDavis Ben 32 değil 38 sayıyorum. Düzenle: kaşlı ayraçları ve tireleri sayıyor olmalısın, boşver.
KyleM

32

TL; DR: Yok.

Adam Davis'in belirttiği gibi, Microsoft stili, ASCII karakterlerinin bir alt kümesi (0-9 ve AF) kullanılarak görüntülenebilen HEX kodlamadır (daha okunabilir hale getirmek için kaşlı ayraçlar ve çizgilerle), ancak bu özellikle ASCII kodlaması değildir.

GUID'leri görüntülemenin microsoft tarzının, aslında 16 baytlık bir integral değer olan (Micheal Trausch'un belirttiği gibi) yalnızca bir GUID'nin bir temsilidir.

Baytları farklı bir karakter setine (ASCII gibi) dönüştürerek bunu farklı, daha kompakt şekillerde de sunabilirsiniz.

Teorik olarak, her baytı genişletilmiş bir ASCII karakteri (255 karakter) olarak görüntüleyebilirsiniz, bu da bir GUID'i 16 karakter uzunluğunda bir dizi olarak kaydetmenize olanak tanır.

Beyaz boşluk karakterleri (CR, boşluk, sekme, vb.) Ve diğer özel karakterleri içereceği için çok okunabilir değildir, bu nedenle bu yalnızca bir GUID'i insan tarafından okunamayan bir karakter biçiminde verimli bir şekilde kaydetmek istiyorsanız mantıklı olacaktır , doğal olarak desteklemeyen bir veritabanında örneğin GUID veya bir küçük ikili değerlerin hızlı eşleştirme: http://en.wikipedia.org/wiki/Extended_ASCII

IMHO, bir GUID'i daha kompakt bir şekilde görüntülemenin en okunabilir yolu, Base64 kodlamasını kullanmaktır; bu, onu 22 karakter uzunluğunda bir dizede kaydetmenize olanak tanır ve aşağıdaki gibi görünmesini sağlar:

7v26IM9P2kmVepd7ZxuXyQ==

Ancak Jeff Atwood'un sitesinde belirttiği gibi, 20 karakterli bir ASCII85 kodlu dizeye bir GUID de aktarabilirsiniz:

[Rb*hlkkXVW+q4s(YSF0

Daha fazla ilham almak için bkz: http://www.codinghorror.com/blog/2005/10/equipping-our-ascii-armor.html


3
C # burada bir Ascii-85 kodlayıcı / kod çözücü yayınladım: stackoverflow.com/questions/2827627/…
sheikhjabootie

1
Keşke bu cevabın tepesinde okuyucuları tuzağa düşürmek ve bir TL görevi görmek için büyük, cesur bir "Yok" olsaydı; DR. ;)
jpmc26

14

Adam'ın MSDN teklifinde bahsettiği gibi, UUID'ler 128 bitlik değerlerdir. Bu, bir değeri tutmak için 16 bayt RAM aldıkları anlamına gelir. Metin temsili 32 bayt (her bir bayt için iki bayt), artı 4 kısa çizgi ve bunları eklemek istiyorsanız iki parantez alacaktır; bu 38 bayta karşılık gelir.

UUID'leri yazılımınızın kullanıcılarına ifşa ediyorsanız, UUID'yi parantezli veya parantezsiz sağlayabileceklerini unutmayın. Değeri herhangi bir yerde depoluyorsanız, en iyisi 16 baytlık ikili gösterim olarak saklamaktır. Diğer UUID uygulamalarıyla birlikte çalışıyorsanız, ikili bir UUID değerini depolarken farklı uygulamalar bayt sırasına göre farklı şeyler yaptığından, birlikte çalışabilirlik için temel metin biçimini kullanmak isteyebilirsiniz.


6

Uzunluk, kodlamaya bağlıdır. Bu kod parçacığı ile standart kodlamayı ve uzunluğu alabilirsiniz:

public void Main() 
{
    var guid = Guid.Empty;
    Write(guid, "N"); // 32 characters
    Write(guid, "D"); // 36 characters (default)
    Write(guid, "B"); // 38 characters
    Write(guid, "P"); // 38 characters
    Write(guid, "X"); // 68 characters
}    

private void Write(Guid guid, string format) 
{
    var guidString = guid.ToString(format);
    Console.WriteLine("{0}: {1} ({2} characters)", format, guidString, guidString.Length);
}

Ayrıntılar için Guid.ToString yöntemine bakın:

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.