Java'da GUID oluşturma


Yanıtlar:


347

Java 5 ve sonraki sürümleriyle birlikte gelen UUID sınıfına bir göz atın .

Örneğin:


7
Kaleb Brasee gibi bir örnek eklerseniz, iyi cevabınız daha da iyi olurdu.
Zero3

AndroidStudio 2.3 ve en azından 21 ve üstü API seviyelerinde çalışır. Belki daha da geriye.
raddevus

5
TL; DR ... "UUID uuid = UUID.randomUUID ();"
Aviram Fireberger

419

java.util.UUID.randomUUID();


2
tekrar dönebilir mi? Çünkü Guid asla tekrar etmeyecek
melek

4
@angel Evet, UUID.randomUUIDyöntemin bir kopyasını döndürmesi teorik olarak mümkün , ancak bu hiç de gerçekçi bir endişe değil . Oracle / OpenJDK uygulaması kriptografik olarak güçlü bir rasgele sayı üreteci kullanır. Bu göz önüne alındığında ve bir UUID'de çok sayıda bit tarafından verilen astronomik aralık göz önüne alındığında, uygulamanızda milyonlarca bu değer üretebilir ve yine de iyi uyuyabilirsiniz. Diğer varyantlardan birinin kullanılması, "boşluk ve zaman", [1] MAC adresi veya adı ve [2] geçerli tarih saatini kısıtlama olarak kullandığından, sıfıra daha yakın çarpışma olasılığını daha da azaltır.
Basil Bourque

@RenniePet Eh, eğer o paranoyaksanız ve yeni bir tane oluştururken zaten kullanılan kimlikler listesine erişebiliyorsanız, listenizde olmayan bir tane alana kadar yeni bir tane oluşturursunuz while: p
Nyerguds

2
Oracle kripto rasgele sayı üreteci tipik olarak rasgele bir tohumu olan bir PRNG'dir. Rasgele tohum tipik olarak OS tarafından sağlanan bir "entropi" kaynağı kullanılarak elde edilir. Bu kaynağı bozabilir veya tehlikeye atabilirseniz, aynı sayıyı üreten bir kripto rasgele sayı üretecinin olasılığı artar. Ayrıca bazı (örneğin sanallaştırılmış) platformlarda işletim sisteminin entropiden kurtulabileceğini belirtmek gerekir. Bu sorunu çözmek için "tehlikeli saldırılar" vardır, ancak entropinin kalitesini düşürmeyi gerektirirler.
Stephen C

Bu sadece akademik bir mesele değil. Bir (gördük doğrulanmamış !! birisi o) iddia etmedi rastgele tabanlı Uuıdlerin benzersiz olmama sorun haline çalıştırın.
Stephen C

32

Ne tür bir UUID istediğinize bağlıdır .

  • Standart Java UUIDsınıfı Sürüm 4 (rastgele) UUID'ler oluşturur. ( GÜNCELLEME - Sürüm 3 (ad) UUID'ler de oluşturulabilir.) Diğer varyantları da işleyebilir, ancak üretemez. (Bu durumda, "sap" terimi yapı UUIDile ilgili örnekler long, byte[]ya da Stringgösterimleri ve bazı uygun erişimcileri sağlar.)

  • Java UUID Jeneratör (JUG) "tarafından tanımlanan UUID tüm 3 'resmi' türlerini uygulama iddia destekleyecek -4122 RFC RFC aslında 4 türlerini tanımlayan ve 5. bir tür bahseder olsa ...".

UUID türleri ve varyantları hakkında daha fazla bilgi için Wikipedia'da iyi bir özet var ve kanlı ayrıntılar RFC 4122 ve diğer spesifikasyonlarda.


1
Tamamen doğru değil, aynı zamanda isim tabanlı (sürüm 3) UUID.nameUUIDFromBytes(byte[] name)
UUID'ler

Ben düzeltilmiş duruyorum. " Belirtilen bayt dizisine dayalı bir tip 3 (adı temel alan) UUID almak için statik fabrika"
Stephen C

Gönderinin doğru olduğunu sanmıyorum. UUID'si Java dokümanlar yapıcı bir tip 2 varyantı, rastgele olmayan oluşturur belirtmektedir. Tip 3 için kullanın public static UUID nameUUIDFromBytes(byte[] name). tip 4 kullanım için public static UUID randomUUID(). Tip 1, JDK sınıfıyla kullanılamaz.
slartibartfast

Hayýr. Sanýrým hemen dođru anladým. Javadocs şöyle der: "Her ne kadar yapıcılar UUID'nin herhangi bir varyantının oluşturulmasına izin verse de (aşağıda açıklanmıştır). ve 4 varyantları, Nitekim tipini 1. dahil olmak üzere javadoc okumak, aşağıda listelenmiştirclockSequence()
Stephen C

27

Mark Byers'ın cevabını bir örnekle genişletmek için:

import java.util.UUID;

public class RandomStringUUID {
    public static void main(String[] args) {
        UUID uuid = UUID.randomUUID();
        System.out.println("UUID=" + uuid.toString() );
    }
}

7

Diğer Cevapları, özellikle doğrudur bu bir tarafından Stephen C .

Java Dışına Ulaşma

Java içinde bir UUID değeri oluşturmak Sürüm 4 (rastgele) ile sınırlıdır , güvenlik endişeleri nedeniyle .

Eğer UUID diğer sürümlerini istiyorsanız, bir cadde dışında Java uygulaması erişime sahip olmaktır JVM üzerinde arayarak UUIDs oluşturmak için:

  • Komut satırı yardımcı programı
    Neredeyse her işletim sistemiyle birlikte gelir.
    Örneğin,uuidgen Mac OS X, BSD ve Linux'ta bulunur.
  • Veritabanı sunucusu
    kullanın JDBC veritabanı sunucusu üzerinde oluşturulan bir UUID almak için.
    Örneğin, uuid-osspuzantı genellikle Postgres ile birlikte gelir . Bu uzantı Sürüm 1, 3 ve 4 değerlerini ve ayrıca birkaç varyasyonu oluşturabilir:
    • uuid_generate_v1mc() - sürüm 1 UUID oluşturur ancak bilgisayarın gerçek MAC adresi yerine rastgele çok noktaya yayın MAC adresi kullanır.
    • uuid_generate_v5(namespace uuid, name text) - SHA-1'in karma yöntemi olarak kullanılması dışında, sürüm 3 UUID gibi çalışan bir sürüm 5 UUID oluşturur.
  • Web Hizmeti
    Örneğin, UUID Üreticisi nil değerleri ve GUID'in yanı sıra Sürüm 1 ve 3'ü oluşturur .

3
Cevabınızla ilgili bazı sorunlar var: Birincisi, sadece standart Java kitaplığından V4 alabileceğiniz yanlış olduğu zaten gösterildi (V3 de mümkündür). İkincisi, standart kütüphanenin yanı sıra Java'da, "güvenlik endişeleri nedeniyle" el-dalgalı bir seçenek olmadığı gibi ses çıkarırsınız. Ve son olarak, Java içinde yapmanın birçok yolu olduğunda (elbette bunlara ihtiyacınız yoksa, örneğin, bir SQL sunucusunda kayıt).
DennisK
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.