Yanıtlar:
Belgelere göre , statik yöntem UUID.randomUUID()
tip 4 UUID üretir.
Bu, bazı tip bilgileri için altı bit kullanıldığı ve kalan 122 bitin rastgele atandığı anlamına gelir.
Altı rasgele olmayan bit, UUID'nin en önemli yarısında dört ve en az önemli yarısında iki ile dağıtılır. Yani UUID'nizin en önemli yarısı 60 bit rasgelelik içerir, bu da bir çarpışma için ortalama 2 ^ 30 UUID üretmeniz gerektiği anlamına gelir (tam UUID için 2 ^ 61 ile karşılaştırıldığında).
Bu yüzden oldukça güvenli olduğunu söyleyebilirim. Bununla birlikte, bunun Carl Seleborg'un belirttiği gibi, diğer UUID türleri için kesinlikle doğru olmadığını unutmayın.
Bu arada, UUID'nin en az önemli yarısını kullanarak (veya sadece SecureRandom kullanarak rastgele bir uzun üreterek) biraz daha iyi durumda olursunuz.
Raymond Chen bu konuda gerçekten mükemmel bir blog yayınına sahip:
GUID'ler genel olarak benzersizdir, ancak GUID'lerin alt dizeleri
Bunun randomUUID kullanmak için en iyi örnek olduğunu düşünüyor:
Sadece rastgele uzun bir değer üretmek daha iyidir, o zaman tüm bitler rastgele. Java 6'da yeni Random (), System.nanoTime () artı sayacı tohum olarak kullanır.
Farklı düzeylerde benzersizlik vardır.
Birçok makinede benzersizliğe ihtiyacınız varsa, benzersiz kimlikleri veya hatta benzersiz kimlikleri gruplamak için merkezi bir veritabanı tablonuz olabilir.
Tek bir uygulamada benzersiz olmanız gerekiyorsa, bir sayacınız (veya gereksinimlerinize bağlı olarak currentTimeMillis () * 1000 veya nanoTime () ile başlayan bir sayacınız olabilir)
YYYYDDDD
Önek olarak Zamanı (Yıl + Yılın Günü) kullanın . Bu, tablolarda ve dizinlerde veritabanı parçalanmasını azaltır. Bu yöntem geri döner byte[40]
. Active Directory SID'nin ( varbinary(85)
) LDAP kullanıcıları için anahtar olduğu ve LDAP kullanıcıları için otomatik olarak oluşturulan bir uygulamanın kullanıldığı karma bir ortamda kullandım. Ayrıca, işlem tablolarında (Bankacılık Endüstrisi) günlük çok sayıda işlem Int
Anahtarlar için standart türleri kullanamaz
private static final DecimalFormat timeFormat4 = new DecimalFormat("0000;0000");
public static byte[] getSidWithCalendar() {
Calendar cal = Calendar.getInstance();
String val = String.valueOf(cal.get(Calendar.YEAR));
val += timeFormat4.format(cal.get(Calendar.DAY_OF_YEAR));
val += UUID.randomUUID().toString().replaceAll("-", "");
return val.getBytes();
}