Saya ingin utilitas yang efisien untuk menghasilkan urutan byte yang unik. UUID adalah kandidat yang baik tetapi UUID.randomUUID().toString()
menghasilkan hal-hal seperti 44e128a5-ac7a-4c9a-be4c-224b6bf81b20
yang baik, tetapi saya lebih suka string tanpa putus.
Saya mencari cara yang efisien untuk menghasilkan string acak, hanya dari karakter alfanumerik (tanpa tanda hubung atau simbol khusus lainnya).
Jawaban:
Ini melakukannya:
sumber
Tanda hubung tidak perlu dihapus dari permintaan HTTP seperti yang Anda lihat di URL utas ini. Tetapi jika Anda ingin menyiapkan URL yang terbentuk dengan baik tanpa bergantung pada data, Anda harus menggunakan URLEncoder.encode (Data string, Pengkodean string) alih-alih mengubah bentuk standar data Anda. Untuk garis representasi string UUID adalah normal.
sumber
http://stackoverflow.com/questions/3804591/efficient-method-to-generate-uuid-string-in-java-uuid-randomuuid-tostring-w?rq=1
Akhirnya menulis sesuatu sendiri berdasarkan implementasi UUID.java. Perhatikan bahwa saya tidak membuat UUID , melainkan hanya string hex 32 byte acak dengan cara yang paling efisien yang dapat saya pikirkan.
Penerapan
Pemakaian
Tes
Beberapa input yang saya uji untuk memastikan itu berfungsi:
sumber
Saya menggunakan JUG (Java UUID Generator) untuk menghasilkan ID unik. Ini unik di seluruh JVM. Cukup bagus untuk digunakan. Berikut ini kode untuk referensi Anda:
Anda dapat mengunduh perpustakaan dari: https://github.com/cowtowncoder/java-uuid-generator
sumber
java.util.UUID
alternatif serius .Solusi sederhana adalah
(Seperti solusi yang ada, hanya saja ia menghindari panggilan String # replaceAll . Penggantian ekspresi reguler tidak diperlukan di sini, jadi String # replace terasa lebih alami, meskipun secara teknis masih diimplementasikan dengan ekspresi reguler. Mengingat bahwa generasi UUID adalah lebih mahal daripada penggantian, seharusnya tidak ada perbedaan signifikan dalam runtime.)
Menggunakan kelas UUID mungkin cukup cepat untuk sebagian besar skenario, meskipun saya berharap bahwa beberapa varian tulisan tangan khusus, yang tidak memerlukan postprocessing, menjadi lebih cepat. Bagaimanapun, hambatan dari keseluruhan perhitungan biasanya akan menjadi generator angka acak. Dalam kasus kelas UUID, ia menggunakan SecureRandom .
Generator nomor acak mana yang digunakan juga merupakan trade-off yang tergantung pada aplikasi. Jika sensitif terhadap keamanan, SecureRandom pada umumnya adalah rekomendasi. Jika tidak, ThreadLocalRandom adalah alternatif (lebih cepat dari SecureRandom atau Acak lama , tetapi tidak aman secara kriptografis).
sumber
Saya kagum melihat begitu banyak benang menggantikan gagasan UUID. Bagaimana dengan ini:
Ini adalah cara berpuasa melakukannya karena seluruh toString () UUID sudah lebih mahal belum lagi ekspresi reguler yang harus diurai dan dieksekusi atau diganti dengan string kosong.
sumber
String.format("0x%016x%016x", f.getMostSignificantBits(), f.getLeastSignificantBits())
replace
.Saya baru saja menyalin metode UUID toString () dan baru saja memperbaruinya untuk menghapus "-" darinya. Ini akan jauh lebih cepat dan lurus ke depan daripada solusi lainnya
Pemakaian:
generateUUIDString(UUID.randomUUID())
Implementasi lain menggunakan refleksi
sumber
Saya menggunakan org.apache.commons.codec.binary.Base64 untuk mengubah UUID menjadi string unik url-safe yang panjangnya 22 karakter dan memiliki keunikan yang sama dengan UUID.
Saya memposting kode saya pada Menyimpan UUID sebagai string base64
sumber
Saya baru saja mengimplementasikan kelas utilitas ini yang membuat UUID sebagai String dengan atau tanpa tanda hubung . Jatuh bebas untuk digunakan dan berbagi. Saya harap ini membantu!
Ini hasilnya:
sumber