Buat GUID di Jawa

378

Apa beberapa cara terbaik untuk membuat GUID di Jawa?

Chris Dutrow
sumber
3
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 .
Mark Byers
sumber
7
Jika Anda memasukkan contoh seperti Kaleb Brasee lakukan, jawaban baik Anda akan lebih baik.
Zero3
Berfungsi di AndroidStudio 2.3 dan setidaknya pada level API 21 dan lebih tinggi. Mungkin lebih jauh ke belakang juga.
raddevus
6
TL; DR ... "UUID uuid = UUID.randomUUID ();"
Aviram Fireberger
420

java.util.UUID.randomUUID();

Kaleb Brasee
sumber
2
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.
Stephen C
32

Tergantung UUID macam apa yang Anda inginkan.

  • 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.

Stephen C
sumber
1
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:

import java.util.UUID;

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

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:

  • 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.
  • Layanan Web
    Misalnya, Pembuat UUID membuat Versi 1 & 3 serta nilai nihil dan GUID .
Basil Bourque
sumber
3
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).
DennisK