Tanımlayıcı seçmek: UUID'ler, kısa kimlikler ve bilgi sızdıranlar

Hangi UUID sürümünün kullanılacağı, v4 çakışmalarının neden pratikte dert olmadığı, ardışık tam sayıların neyi ele verdiği, kısa kimlik alfabelerinin nasıl bir takas sunduğu ve rastgele bitlerin nereden gelmesi gerektiği.

İçeride kalan her şey için UUID v4 kullanın, tanımlayıcı büyük bir tablonun birincil anahtarı olduğunda v7, birinin yüksek sesle okuması gerektiğinde ise kısıtlı bir alfabeden üretilmiş kısa bir kod kullanın. Herkese açık hiçbir yerde ardışık tam sayı kullanmayın.

Önemli olan UUID sürümleri

Bir UUID 128 bittir. Dört bit sürümü, iki bit varyantı taşır, dolayısıyla hiçbir sürüm 128 bitin tamamını harcayamaz.

SürümNe içerirNe zaman kullanılır
v160 bit zaman damgası, 14 bit saat sırası, 48 bit düğüm kimliği (MAC adresi)Yalnızca eski veriler için
v3 / v5Bir ad alanı ile bir adın MD5 veya SHA-1 özetiDeterministik kimlikler gerektiğinde
v4122 rastgele bit, başka hiçbir şeyVarsayılan; hiçbir şeyin çıkarsanamaması gerektiğinde
v748 bit milisaniye zaman damgası, ardından 74 rastgele bitEkleme sırasının önemli olduğu anahtarlarda

Uyarıcı örnek v1'dir. Oluşturulma zamanını ve çoğu uygulamada onu üreten makinenin MAC adresini gömer; 1999'da Melissa virüsünün yazarının izini sürmeye bu tür tanımlayıcılar yardım etmişti. 2024'te RFC 9562 ile standartlaşan v7 ise oluşturulma zamanını bilerek yayımlar: hem özelliği hem bedeli budur.

Çakışma sorusu

Bir v4 UUID 122 rastgele bit taşır, yani bunlardan 2^122 tane, kabaca 5.3 x 10^36 tane vardır. Önemli olan uzayın büyüklüğü değil, doğum günü sınırıdır: n değerden herhangi ikisinin eşleşme olasılığı yaklaşık n karenin 2^123'e bölümüdür. Üretilmiş bir trilyon UUID'de yinelenme olasılığı on trilyonda bir civarındadır, yazı tura kadar bir olasılık içinse yaklaşık 2.7 x 10^18 değer gerekir; bu da saniyede bir milyar üretimle yaklaşık 85 yıldır.

"Pratikte bir kaygı değil" yine de "imkânsız" demek değildir ve açık hiçbir zaman aritmetikte olmaz. Yinelenmeler üreticiden gelir: sabit bir tohum, entropi havuzuyla birlikte klonlanmış bir sanal makine, kaydedilmiş PRNG durumunu içinde taşıyan bir konteyner imajı. Benzersizlik biçime değil rastgelelik kaynağına aittir, o yüzden sütundaki benzersizlik kısıtını yerinde bırakın.

Sıralama, indeks yerelliği ve sızıntı

Rastgele tanımlayıcılar dağılır. Bir B ağacı indeksinde her ekleme rastgele bir yaprak sayfaya düşer, dolayısıyla çalışma kümesi indeksin sağ kenarı değil tamamı olur, önbellek isabet oranları düşer ve sayfalar bölünür. Zamanla artan bir anahtar tek bir yere eklenir ve aynı birkaç sayfayı sıcak tutar. v7 ile ULID bu yüzden vardır; ULID, 48 bit milisaniye zaman damgası artı 80 rastgele bittir ve Crockford base32 ile sıralanabilir 26 karakter olarak yazılır.

Bedeli öngörülebilirliktir: zamana göre sıralı bir kimlik, kaydının ne zaman oluşturulduğunu yayımlar, dolayısıyla bir avuç örnek kayıt oranlarını ve sakin saatleri ele verir. Bu sizin için önemliyse v4 kullanın ve indeks maliyetini ödeyin.

Ardışık tam sayılar daha da ileri gider. /invoices/1041 yaklaşık bin fatura kestiğinizi söyler, bir hafta arayla alınmış iki kimlik de büyüme hızınızı verir. Daha kötüsü, bir saldırgan 1040'ı isteyebilir. Sunucu bu kaydı, var olduğu ve çağıran oturum açtığı için, kimin sahibi olduğunu denetlemeden döndürüyorsa bu bozuk bir erişim denetimi hatasıdır ve güvensiz doğrudan nesne referansı olarak kayıtlıdır. Tahmin edilemeyen bir kimlik yetkilendirme denetimi yerine geçmez, ama en azından kimsenin tabloyu adım adım gezmesine izin vermez.

Slug'lar da birer tanımlayıcıdır ve düzgün üretildiklerinde hacim hakkında hiçbir şey sızdırmazlar: aksanlar sadeleştirilir, harfler küçültülür, noktalama tirelere indirgenir; Slug Generator tam olarak bunu yapar. Yayımdan sonra slug'ı sabit tutun; değiştirmek gelen bağlantıları kırar.

Kısa kimlikler, alfabeler ve uzunluk

Rastgele bir kodun her karakteri alfabe boyutunun log2'si kadar değer taşır: base62 için 5,95 bit, base32 için 5 bit, onaltılık için 4 bit. Belirli bir hacimdeki çakışma olasılığını uzunluk ile alfabe belirler.

Uzunluk (base62)Farklı değer sayısıBit1 milyar kimlik içinde çakışma olasılığı
82.2 x 10^1443.7Kesin
108.4 x 10^1759.5Yaklaşık %45
123.2 x 10^2171.5Yaklaşık 6.500'de 1
164.8 x 10^2895.3Yaklaşık 100 milyarda 1

Bu, her karakterin bağımsız biçimde rastgele olduğunu varsayar; inv_ gibi bir önek sıfır bit ekler.

Bir insanın okuyacağı hiçbir şeyde base62 doğru alfabe değildir. 0 ile O, 1 ile l ve I olmayı bekleyen yazım hatalarıdır ve büyük küçük harfe duyarlı bir kod telefon görüşmesinden sağ çıkamaz. Crockford base32, I, L, O ve U harflerini atar ve girdide her iki harf durumunu kabul eder; fazladan bir karaktere değer.

Rastgele bitler nereden gelir

Math.random() kriptografik bir kaynak değildir. V8 bunu xorshift128+ ile gerçekler; bu üretecin iç durumu kısa bir çıktı dizisinden geri elde edilebilir, sonrasında gelecekteki her değer öngörülebilir olur. Bir demo karıştırması ya da yer tutucu için uygundur. Oturum tanımlayıcısı, API anahtarı, sıfırlama bağlantısı veya token için yanlıştır.

// Browsers, Node 19+, Deno and Bun
const id = crypto.randomUUID();

const bytes = new Uint8Array(16);
crypto.getRandomValues(bytes);

Başka yerlerde: Node'da crypto.randomBytes, Python'da secrets.token_urlsafe, Go'da crypto/rand, Java'da SecureRandom, PHP'de random_bytes. UUID Generator kriptografik olarak rastgele v4 değerleri üretir, Password Generator da aynı tarayıcı API'sini kullanır; Random Numbers ise sırlar için değil örnekleme içindir.

Kendiniz yazarken düşülen bir tuzak: rastgele bir baytı % 62 ile 62 karakterlik bir alfabeye eşlemek dağılımı ilk sekiz karaktere doğru çarpıtır; bunun yerine reddetme örneklemesi kullanın.

Yer tutucu ve örnek veri

Lorem ipsum bozulmuş Cicero metnidir ve okunamaz olduğu için ayakta kalır: dil olmadan dile benzeyen bir metin, bir yerleşimin cümleleri üzerinden değil biçimi ve satır uzunluğu üzerinden değerlendirilmesini sağlar; Lorem Ipsum üreticisinin ürettiği de budur. Onay öncesinde gerçekçi metinle değiştirin, çünkü yer tutucu Latince, gerçek bir başlığın yol açacağı taşmayı gizler.

Uydurulmuş verinin tek bir kuralı vardır: asla gerçeğiyle karıştırılabilir olmamalıdır.

  • Kart numaraları bir ödeme sağlayıcısının yayımladığı test aralığından gelir ya da Luhn denetiminden düpedüz kalır. Luhn'dan geçen rastgele 16 haneli bir numara birine aittir.
  • Ulusal kimlik numaraları ayrılmış aralıkları kullanır. ABD Sosyal Güvenlik numaralarından 000, 666 veya 900 ila 999 ile başlayanlar hiçbir zaman verilmez.
  • RFC 2606 ile ayrılmış olan example.com ve kardeşlerini, belgeleme için ayrılmış 192.0.2.0/24 bloğunu kullanın.

Test verisi üretime beklenenden sık ulaşır: yanlış veritabanına yöneltilmiş bir tohum betiği, tüm listeye gönderilen bir e-posta şablonunda unutulmuş bir yer tutucu. Sahte kayıtlar bariz biçimde sahte görünmelidir ki destek ekibi harekete geçmeden önce bir insan fark etsin.

Kısaca QR kodları

Bir QR kodu modüllerden oluşan bir ızgaradır; 1'den 40'a kadar sürümleri vardır ve 21x21'den 177x177'ye kadar uzanır. Sürümü yükün uzunluğu belirler; sabit bir baskı boyutunda daha yüksek sürüm daha küçük modül demektir, bu da daha iyi baskı ve daha yakın tarama gerektirir. URL'yi QR Code Generator'a vermeden önce kısaltın ve alfanümerik kipin yalnızca büyük harf olduğunu unutmayın; bu yüzden HTTPS://EXAMPLE.COM küçük harfli halinden daha küçük kodlanır.

Hata düzeltmenin dört düzeyi vardır ve hasarlı bir kodun kabaca %7 (L), %15 (M), %25 (Q) ve %30 (H) kadarını kurtarır. Yedeklilik kapasiteden götürür, dolayısıyla daha yüksek düzey aynı yükü daha yoğun bir sürüme iter. Alışılmış varsayılan M'dir; küçük baskı, kavisli yüzey ya da ortasına konan bir logo için Q veya H seçin; logo, yedeklilik onu soğurduğu için çalışır.

Bir kodun taranıp taranmayacağına iki fiziksel koşul karar verir. Sessiz bölge, her kenarda dört modüllük boş bir kenar payıdır; kod çözücü sınırı bununla bulur, bu yüzden bir çerçeveye ya da fotoğrafa bitişik bir kod çoğu zaman okunmaz. Karşıtlık gerçekten açık bir zemin üzerinde gerçekten koyu olmalıdır: beyaz üzerine soluk mavi sık görülen bir başarısızlıktır ve pek çok kod çözücü ters kontrastlı kodları reddeder.