Hangi UUID sürümü kullanılacak?


332

Hangi UUID sürümünü kullanmalısınız? Her sürümün neyi gerektirdiğini açıklayan çok sayıda iş parçacığı gördüm, ancak hangi uygulamalar için en iyi olanı bulmakta sorun yaşıyorum.


2
Seçimleriniz neler?
Gabe

Python ile çalışan her şey. Sanırım bu docs.python.org/2/library/uuid.html . 1,3,4,5.
user1802143

Sürüm 3 ve 5'i merak ediyorsanız, v5 UUID Oluşturma adlı bu Soruya bakın . İsim ve isim alanı nedir? .
Basil Bourque

Yanıtlar:


414

Bir UUID oluşturmanın iki farklı yolu vardır.

Yalnızca benzersiz bir kimliğe ihtiyacınız varsa, sürüm 1 veya sürüm 4 istersiniz.

  • Sürüm 1: Bu, ağ kartı MAC adresi ve zamanlayıcıya dayalı benzersiz bir kimlik oluşturur. Bu kimlikleri tahmin etmek kolaydır (biri verildiğinde, diğerini tahmin edebilirim) ve ağ kartınıza kadar izlenebilir. Bunları oluşturmanız önerilmez.

  • Sürüm 4: Bunlar rastgele (veya sözde rastgele) sayılardan üretilir. Sadece bir UUID oluşturmanız gerekiyorsa, muhtemelen budur.

Belirli bir addan her zaman aynı UUID'yi oluşturmanız gerekirse, sürüm 3 veya sürüm 5 istersiniz.

  • Sürüm 3: Bu, bir ad alanının ve adın MD5 karma değerinden benzersiz bir kimlik oluşturur. Geriye dönük uyumluluğa ihtiyacınız varsa (adlardan UUID üreten başka bir sistemle), bunu kullanın.

  • Sürüm 5: Bu, bir ad alanının ve adın SHA-1 karmasından benzersiz bir kimlik oluşturur. Bu tercih edilen sürümdür.


17
Ekleyeceğim: Belirli bir reproducibleaddan bir UUID oluşturmanız gerekiyorsa , sürüm 3 veya sürüm 5 istersiniz. Bu algoritmayı aynı girdiyi beslerseniz, aynı çıktıyı oluşturur.
anregen

3
Bir bulut bilgi işlem ortamında (AWS veya GAE gibi), Sürüm 1'in zayıflığının unutulmaya yol açtığı görülüyor. Belirli bir uygulamanın UUID üretecine zaman içinde binlerce farklı MAC adresinin uygulanması muhtemel olduğunda, öngörülebilirliği ve / veya izlenebilirliği ortadan kaldırır.
Buffalo Rabor

3
@ user239558 Bir UUID'nin hedefi benzersiz olması nedeniyle, UUIDv5 yine de tercih edilebilir.
Epicurist

7
Sürüm 1'in "önerilmemesi" hakkındaki bu yorum aşırı derecede basittir. Birçok durumda, bunlar gerçekten iyi ve tercih edilir. Ancak, güvenilir olmayan aktörler tarafından kullanılabilir hale getirilebilecek bu UUID bilgilerinin herhangi birinden sızma konusunda güvenlik endişeleriniz varsa: (a) UUID'yi oluşturan makinenin MAC adresi veya (b) oluşturulduğu tarih-saat, o zaman Sürüm 1'den kaçının. Bu iki bilgi parçası hassas değilse , Sürüm 1 gitmek için mükemmel bir yoldur.
Basil Bourque

9
Sürüm 2'ye ne oldu?
Matthew Woo

53

Rastgele bir sayı istiyorsanız, rastgele bir sayı kitaplığı kullanın. Etkin bir şekilde 0.00 ... benzersiz bir tanımlayıcı istiyorsanız, burada daha fazla 0s ...% 001 çarpışma şansı varsa, UUIDv1'i kullanmalısınız. UUIDv3 ve v5 için Nick'in gönderisine bakın.

UUIDv1 güvenli DEĞİLDİR. Öyle değil. Tahmin edilemez, BENZERSİZ olması gerekiyordu. UUIDv1, geçerli zaman damgasının yanı sıra bir makine tanımlayıcı ve artı bu algoritma tarafından bir daha oluşturulmayacak bir sayı yapmak için bazı rastgele ish öğelerini kullanır. Bu, işlem kimliği için uygundur (herkes milyonlarca işlem yapsa bile).

Dürüst olmak gerekirse, UUIDv4'ün neden var olduğunu anlamıyorum ... RFC4122'yi okurken , bu sürüm çarpışma olasılığını ortadan kaldırmıyor gibi görünüyor. Sadece rastgele bir sayı üretecidir. Bu doğruysa, dünyadaki iki makinenin sonunda aynı "UUID" v4'ü yarattığından çok İYİ şansınız var (alıntılar çünkü U.niversal U.niqueness'i garanti etmek için bir mekanizma yok). Bu durumda, algoritmanın benzersiz değerler üretmek için yöntemleri tanımlayan bir RFC'ye ait olduğunu düşünmüyorum. Rasgelelik üretme konusunda bir RFC'ye ait olacaktır. Rastgele sayılar kümesi için:

chance_of_collision = 1 - (set_size! / (set_size - tries)!) / (set_size ^ tries)

67
Bir yüzyıl boyunca saniyede bir milyar UUID üretmez ve bir madeni para çevirme kazanmazsanız , iki UUID sürüm 4 uygulamasının çarpıştığını görmezsiniz . Unutmayın, çok büyükset_size olan 2 ^ 122'dir .
Kevin

8
V4 algoritması seri değildir, yani v4 tarafından üretilen ilk iki UUID'nin eşleşmesi ihtimali vardır. Birçok seçenek olduğu için, bir tekrar oluşturmadan önce benzersiz seçeneklerin tükenmesi gerektiği anlamına gelmez. Bu her zaman olabilir.
anregen

7
Aslında matematiği yapamıyorsunuz. Biz (bir tür olarak) her saniye 1 milyar UUID üretmiyoruz. Bu yüzden ilk çarpışmaya (ortalama olarak) kadar 100 yıldan daha uzun bir süremiz var.
Kevin

31
V4 "çarpışabilir", ancak olasılık, çoğu kullanım durumu için riske değecek kadar düşüktür. Re: "Dünyadaki iki makine sonunda aynı 'UUID'v4'ü yaratıyor", elbette, ama bu bir sorun değil, çünkü UUID kullanan dünyadaki çoğu makine onları farklı bağlamlarda kullanıyor. Demek istediğim, kendi dahili uygulamam için dahili uygulamanızla aynı UUID'yi oluşturursam önemli değil. Çarpışmalar ancak aynı bağlamda gerçekleşirse önemlidir. (bir uygulamada bile, birçok

6
Bu, kulağa güvenli olması için ihtiyacınız yoksa, sürüm 1'i kullanın. Güvenli olmanız ve şanslı hissetmeniz (veya gerçekten şanssız hissetmeniz) sürüm 4'ü kullanın.
Vaccano

16

Bu çok genel bir soru. Bir cevap: "ne tür bir UUID oluşturmak istediğinize bağlıdır". Ama daha iyisi şu: "Peki, cevap vermeden önce, çoğu modern işletim sisteminin sağladığı UUID oluşturma işlevini çağırmak yerine neden kendi UUID oluşturma algoritmanızı kodlamanız gerektiğini söyleyebilir misiniz?"

Bunu yapmak daha kolay ve daha güvenlidir ve muhtemelen kendinizinkini oluşturmanız gerekmediğinden , bir uygulamayı kodlamayı neden zahmete soktunuz? Bu durumda, yanıt O / S, programlama dili veya çerçeveniz ne olursa olsun kullanılır. Örneğin, Windows'da CoCreateGuid veya UuidCreate veya kullanımda olan çok sayıda çerçeveden elde edilebilen çeşitli sarıcılardan biri vardır. Linux'ta uuid_generate var .

Herhangi bir nedenden dolayı kesinlikle kendinizinkini oluşturmanız gerekiyorsa, en azından v1 ve v2 UUID'leri üretmekten uzak durmanız iyi olur. Bunları düzeltmek zor. Bunun yerine v3, v4 veya v5 UUID'lere yapışır.

Güncelleme : açıklama olarak, size Python ve bağlantıyı kullanarak vurguluyorsanız bu . Sağlanan arabirime bakarak, sizin için en kolay seçenek arayarak bir v4 UUID (yani, rastgele verilerden oluşturulmuş) oluşturmak olacaktır uuid.uuid4().

Bir UUID oluşturmak için karma yapmanız gereken (veya yapabileceğiniz) bazı verileriniz varsa, v3 (MD5'e dayanan) veya v5 (SHA1'e dayanan) kullanabilirsiniz. Bir v3 veya v5 UUID oluşturmak basittir: önce oluşturmak istediğiniz UUID türünü seçin (muhtemelen v5'i seçmelisiniz) ve sonra uygun ad alanını seçin ve işlevi UUID'yi oluşturmak için kullanmak istediğiniz verilerle çağırın. Örneğin, bir URL'ye sahip olursanız aşağıdakileri kullanırsınız NAMESPACE_URL:

uuid.uuid3(uuid.NAMESPACE_URL, 'https://ripple.com')

Bu UUID'nin, aynı URL için oluşturulan ve şu şekilde oluşturulan v5 UUID değerinden farklı olacağını lütfen unutmayın:

uuid.uuid5(uuid.NAMESPACE_URL, 'https://ripple.com')

V3 ve v5 URL'lerinin güzel bir özelliği, uygulamalar arasında birlikte çalışabilir olmalarıdır. Diğer bir deyişle, eğer iki farklı sistemler RFC4122 ile uyumlu olduğu, bunlar (veya en azından olacağı bir uygulama kullanıyor olmalıdır tüm diğer şeyler eşit ise) hem yani aynı ad ile aynı sürümüne UUID oluşturmak (aynı UUID oluşturmak aynı veriler). Bu özellik bazı durumlarda (özellikle içeriğe yönelik depolama senaryolarında) çok yardımcı olabilir , ancak belki de sizin durumunuzda olmayabilir.


4
Ben OP sormadı çünkü tahmin ediyorum: nasıl "en modern işletim sistemlerinin sağladığı UUID nesil işlevselliğini çağırmak yerine [benim] kendi UUID nesil algoritmasını kodlamak?"
anregen

Bunun yanı sıra, UUIDv3 ve v5'in iyi bir açıklaması olduğunu düşünüyorum. V1'in neden iyi bir seçim olabileceğini düşündüğümle ilgili aşağıdaki cevabımı görün.
anregen

NAMESPACE_URL nedir? alabileceğim bir değişken? Nereden?
stackdave

@stackdave NAMESPACE_URLgenellikle için eşit bir UUID 6ba7b811-9dad-11d1-80b4-00c04fd430c830. sayfasında yapılan öneri sonrasında, RFC-4122 .
Jamie Ridding

2

Postgres dokümantasyon arasındaki farkları açıklar UUIDs. Onlardan birkaçı:

V3:

uuid_generate_v3(namespace uuid, name text) - Bu işlev, belirtilen girdi adını kullanarak belirtilen ad alanında sürüm 3 UUID oluşturur.

V4:

uuid_generate_v4 - Bu işlev, tamamen rastgele sayılardan türetilmiş bir sürüm 4 UUID oluşturur.

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.