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.
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.
Yanıtlar:
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.
reproducible
addan 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.
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)
set_size
olan 2 ^ 122'dir .
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.
NAMESPACE_URL
genellikle için eşit bir UUID 6ba7b811-9dad-11d1-80b4-00c04fd430c8
30. sayfasında yapılan öneri sonrasında, RFC-4122 .
Postgres dokümantasyon arasındaki farkları açıklar UUID
s. 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.