Pertanyaan di stackoverflow.com/questions/325443/generate-uuid-in-java lebih tentang tabrakan GUID, lalu bagaimana setara dengan GUID dalam tumpukan tech Java, yang merupakan (saya pikir) lebih merupakan fokus pertanyaan ini.
Jon Adams
Jawaban:
348
Lihatlah kelas UUID yang dibundel dengan Java 5 dan yang lebih baru.
Sebagai contoh:
Jika Anda menginginkan UUID acak, Anda dapat menggunakan metode randomUUID .
Jika Anda ingin UUID diinisialisasi ke nilai tertentu, Anda dapat menggunakan konstruktor UUID atau metode fromString .
Bisakah itu kembali berulang? karena Guid tidak akan mengulangi
malaikat
4
@ malaikat Ya, secara teori dimungkinkan UUID.randomUUIDmetode mengembalikan duplikat, tetapi ini sama sekali bukan masalah yang realistis . Implementasi Oracle / OpenJDK menggunakan generator angka acak yang kuat secara kriptografis. Mengingat itu, dan mengingat rentang astronomi yang diberikan oleh begitu banyak bit dalam UUID, Anda dapat menghasilkan jutaan nilai seperti itu di aplikasi Anda dan masih tidur nyenyak. Menggunakan salah satu varian lain semakin mengurangi kemungkinan tabrakan bahkan lebih dekat ke nol karena menggunakan "ruang dan waktu", [1] alamat atau nama MAC, dan [2] tanggal-waktu saat ini, sebagai kendala.
Basil Bourque
@RenniePet Eh, jika Anda paranoid itu, dan Anda mendapatkan akses ke daftar ID yang sudah digunakan saat membuat yang baru, Anda hanya membuat yang baru whilesampai Anda mendapat yang tidak ada di dalam daftar Anda: p
Nyerguds
2
Oracle crypto random number generator biasanya PRNG dengan seed acak. Benih acak biasanya diperoleh dengan menggunakan sumber "entropi" yang disediakan oleh OS. Jika Anda dapat menurunkan atau kompromi sumber itu, maka kemungkinan generator nomor acak kripto menghasilkan nomor yang sama meningkat. Perlu juga dicatat bahwa pada beberapa platform (misalnya divirtualisasi), OS dapat kehabisan entropi. Ada "peretasan cerdik" untuk mengatasinya, tetapi mereka memerlukan penurunan kualitas entropi.
Stephen C
Ini bukan hanya masalah akademis. Saya telah melihat klaim ( tidak terverifikasi !! ) bahwa seseorang memang mengalami masalah dengan UUID berbasis acak yang tidak unik.
Kelas Java standar UUIDmenghasilkan Versi 4 (acak) UUID. ( PEMBARUAN - Versi 3 (nama) UUID juga dapat dibuat.) Ia juga dapat menangani varian lain, meskipun tidak dapat membuatnya. (Dalam hal ini, "handle" berarti membuat UUIDinstance dari long, byte[]atau Stringrepresentasi, dan menyediakan beberapa accessor yang sesuai.)
The Java UUID Generator (JUG) dimaksudkan implementasi untuk mendukung "semua 3 jenis 'resmi' dari UUID seperti yang didefinisikan oleh RFC-4122 " ... meskipun RFC benar-benar mendefinisikan 4 jenis dan menyebutkan jenis-5.
Untuk informasi lebih lanjut tentang jenis dan varian UUID, ada ringkasan yang bagus di Wikipedia , dan detail berdarahnya ada di RFC 4122 dan spesifikasi lainnya.
Tidak sepenuhnya benar, ia juga dapat menghasilkan UUID berbasis-nama (versi 3) denganUUID.nameUUIDFromBytes(byte[] name)
DennisK
Saya berdiri dikoreksi. Saya mengandalkan deskripsi javadoc yang mengatakan "Pabrik statis untuk mengambil UUID tipe 3 (berdasarkan nama) berdasarkan array byte yang ditentukan."
Stephen C
Saya tidak berpikir posting itu akurat. Dokumen Java UUID menyatakan bahwa konstruktor menghasilkan varian tipe 2, bukan acak. Untuk penggunaan tipe 3 public static UUID nameUUIDFromBytes(byte[] name). untuk penggunaan tipe 4 public static UUID randomUUID(). Tipe 1 tidak tersedia dengan kelas JDK.
slartibartfast
Tidak. Kurasa aku benar. Status javadocs: "meskipun konstruktor memungkinkan pembuatan varian UUID (dijelaskan di bawah)." dan 4 varian tercantum di bawah ini, termasuk tipe 1. Memang, baca javadoc untukclockSequence()
Stephen C
27
Hanya untuk memperluas jawaban Mark Byers dengan sebuah contoh:
Jika Anda ingin versi lain dari UUID, satu jalan adalah membuat aplikasi Java Anda menjangkau di luar JVM untuk menghasilkan UUID dengan memanggil:
Utilitas baris perintah Dibundel dengan hampir setiap sistem operasi. Misalnya, uuidgenditemukan di Mac OS X, BSD, dan Linux.
Server basis data Gunakan JDBC untuk mengambil UUID yang dibuat di server basis data. Sebagai contoh, uuid-osspekstensi sering dibundel dengan Postgres . Ekstensi itu dapat menghasilkan nilai Versi 1, 3, dan 4 dan juga variasi pasangan:
uuid_generate_v1mc() - Menghasilkan UUID versi 1 tetapi menggunakan alamat MAC multicast acak dan bukan alamat MAC sebenarnya dari komputer.
uuid_generate_v5(namespace uuid, name text) - Menghasilkan UUID versi 5, yang bekerja seperti UUID versi 3 kecuali bahwa SHA-1 digunakan sebagai metode hashing.
Saya punya beberapa masalah dengan jawaban Anda: Pertama, sudah terbukti salah bahwa Anda hanya bisa mendapatkan V4 dari perpustakaan Java standar (V3 juga dimungkinkan). Kedua, Anda membuatnya terdengar seperti tidak ada pilihan di Jawa selain perpustakaan standar, bersama dengan tangan bergelombang "karena masalah keamanan". Dan terakhir, biasanya tidak efisien (pemrograman-dan / atau kinerja-bijaksana) untuk mulai tergantung pada sumber-sumber luar ketika ada banyak cara untuk melakukannya di Jawa (kecuali jika Anda membutuhkannya di dalamnya, tentu saja, misalnya sebagai bagian dari menciptakan catatan di server SQL).
Jawaban:
Lihatlah kelas UUID yang dibundel dengan Java 5 dan yang lebih baru.
Sebagai contoh:
sumber
java.util.UUID.randomUUID();
sumber
UUID.randomUUID
metode mengembalikan duplikat, tetapi ini sama sekali bukan masalah yang realistis . Implementasi Oracle / OpenJDK menggunakan generator angka acak yang kuat secara kriptografis. Mengingat itu, dan mengingat rentang astronomi yang diberikan oleh begitu banyak bit dalam UUID, Anda dapat menghasilkan jutaan nilai seperti itu di aplikasi Anda dan masih tidur nyenyak. Menggunakan salah satu varian lain semakin mengurangi kemungkinan tabrakan bahkan lebih dekat ke nol karena menggunakan "ruang dan waktu", [1] alamat atau nama MAC, dan [2] tanggal-waktu saat ini, sebagai kendala.while
sampai Anda mendapat yang tidak ada di dalam daftar Anda: pTergantung UUID macam apa yang Anda inginkan.
Kelas Java standar
UUID
menghasilkan Versi 4 (acak) UUID. ( PEMBARUAN - Versi 3 (nama) UUID juga dapat dibuat.) Ia juga dapat menangani varian lain, meskipun tidak dapat membuatnya. (Dalam hal ini, "handle" berarti membuatUUID
instance darilong
,byte[]
atauString
representasi, dan menyediakan beberapa accessor yang sesuai.)The Java UUID Generator (JUG) dimaksudkan implementasi untuk mendukung "semua 3 jenis 'resmi' dari UUID seperti yang didefinisikan oleh RFC-4122 " ... meskipun RFC benar-benar mendefinisikan 4 jenis dan menyebutkan jenis-5.
Untuk informasi lebih lanjut tentang jenis dan varian UUID, ada ringkasan yang bagus di Wikipedia , dan detail berdarahnya ada di RFC 4122 dan spesifikasi lainnya.
sumber
UUID.nameUUIDFromBytes(byte[] name)
public static UUID nameUUIDFromBytes(byte[] name)
. untuk penggunaan tipe 4public static UUID randomUUID()
. Tipe 1 tidak tersedia dengan kelas JDK.clockSequence()
Hanya untuk memperluas jawaban Mark Byers dengan sebuah contoh:
sumber
Jawaban lain benar, terutama yang satu ini oleh Stephen C .
Menjangkau Luar Jawa
Menghasilkan nilai UUID dalam Java terbatas pada Versi 4 (acak) karena masalah keamanan.
Jika Anda ingin versi lain dari UUID, satu jalan adalah membuat aplikasi Java Anda menjangkau di luar JVM untuk menghasilkan UUID dengan memanggil:
Dibundel dengan hampir setiap sistem operasi.
Misalnya,
uuidgen
ditemukan di Mac OS X, BSD, dan Linux.Gunakan JDBC untuk mengambil UUID yang dibuat di server basis data.
Sebagai contoh,
uuid-ossp
ekstensi sering dibundel dengan Postgres . Ekstensi itu dapat menghasilkan nilai Versi 1, 3, dan 4 dan juga variasi pasangan:uuid_generate_v1mc()
- Menghasilkan UUID versi 1 tetapi menggunakan alamat MAC multicast acak dan bukan alamat MAC sebenarnya dari komputer.uuid_generate_v5(namespace uuid, name text)
- Menghasilkan UUID versi 5, yang bekerja seperti UUID versi 3 kecuali bahwa SHA-1 digunakan sebagai metode hashing.Misalnya, Pembuat UUID membuat Versi 1 & 3 serta nilai nihil dan GUID .
sumber