Tạo GUID trong Java


Câu trả lời:


347

Hãy xem lớp UUID được gói cùng với Java 5 trở lên.

Ví dụ:

  • Nếu bạn muốn một UUID ngẫu nhiên, bạn có thể sử dụng phương pháp RandomUUID .
  • Nếu bạn muốn một UUID được khởi tạo thành một giá trị cụ thể, bạn có thể sử dụng hàm tạo UUID hoặc phương thức fromString .

7
Nếu bạn bao gồm một ví dụ như Kaleb Brasee đã làm, câu trả lời tốt của bạn sẽ còn tốt hơn nữa.
Zero3

Hoạt động trong AndroidStudio 2.3 và trên các cấp API 21 trở lên. Có lẽ xa hơn nữa.
raddevus

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

419

java.util.UUID.randomUUID();


2
nó có thể trở lại lặp lại? bởi vì Guid sẽ không bao giờ lặp lại
thiên thần

4
@ Phúc Có, về mặt lý thuyết là UUID.randomUUIDphương pháp có thể trả về một bản sao, nhưng điều này hoàn toàn không phảimột mối quan tâm thực tế . Việc triển khai Oracle / OpenJDK sử dụng trình tạo số ngẫu nhiên mạnh về mật mã. Do đó, và được đưa ra phạm vi thiên văn được cung cấp bởi rất nhiều bit trong UUID, bạn có thể tạo ra hàng triệu giá trị như vậy trong ứng dụng của mình và vẫn ngủ ngon. Sử dụng một trong các biến thể khác làm giảm thêm khả năng va chạm gần bằng 0 do sử dụng "không gian và thời gian", [1] địa chỉ hoặc tên MAC và [2] thời gian ngày hiện tại, làm hạn chế.
Basil Bourque

@RenniePet Eh, nếu bạn bị hoang tưởng và bạn có quyền truy cập vào danh sách ID đã được sử dụng khi tạo một ID mới, bạn chỉ cần tạo một cái mới whilecho đến khi bạn có một cái không có trong danh sách của bạn: p
Nyerguds

2
Trình tạo số ngẫu nhiên của Oracle crypto thường là một PRNG với một hạt giống ngẫu nhiên. Hạt giống ngẫu nhiên thường thu được bằng cách sử dụng một nguồn "entropy" do HĐH cung cấp. Nếu bạn có thể làm giảm hoặc thỏa hiệp nguồn đó, thì xác suất của trình tạo số ngẫu nhiên tiền điện tử tạo ra cùng một số được tăng lên. Cũng cần lưu ý rằng trên một số nền tảng (ví dụ ảo hóa), HĐH có thể hết entropy. Có những "hack tinh ranh" để khắc phục điều này, nhưng chúng đòi hỏi làm giảm chất lượng của entropy.
Stephen C

Đây không chỉ là một mối quan tâm học tập. Tôi đã thấy một tuyên bố ( chưa được xác minh !! ) rằng ai đó đã gặp phải vấn đề với các UUID dựa trên ngẫu nhiên không phải là duy nhất.
Stephen C

32

Nó phụ thuộc vào loại UUID bạn muốn.

  • Lớp Java tiêu chuẩn UUIDtạo UUID phiên bản 4 (ngẫu nhiên). ( CẬP NHẬT - UUID phiên bản 3 (tên) cũng có thể được tạo.) Nó cũng có thể xử lý các biến thể khác, mặc dù nó không thể tạo ra chúng. (Trong trường hợp này, "xử lý" có nghĩa là xây dựng UUIDtrường từ long, byte[]hoặc Stringcơ quan đại diện, và cung cấp truy cập thông thích hợp.)

  • Các mục đích triển khai của Trình tạo UUID Java (JUG) để hỗ trợ các loại UUID "tất cả 3" chính thức theo định nghĩa của RFC-4122 "... mặc dù RFC thực sự định nghĩa 4 loại và đề cập đến loại thứ 5.

Để biết thêm thông tin về các loại và biến thể của UUID, có một bản tóm tắt tốt trong Wikipedia và các chi tiết chính trong RFC 4122 và các thông số kỹ thuật khác.


1
Không hoàn toàn đúng, nó cũng có thể tạo UUID dựa trên tên (phiên bản 3) vớiUUID.nameUUIDFromBytes(byte[] name)
DennisK

Tôi đứng sửa. Tôi đã dựa vào mô tả javadoc có nội dung "Nhà máy tĩnh để lấy UUID loại 3 (dựa trên tên) dựa trên mảng byte được chỉ định."
Stephen C

Tôi không nghĩ bài viết là chính xác. Các tài liệu Java UUID nêu rõ hàm tạo tạo một biến thể loại 2, không phải ngẫu nhiên. Đối với loại 3 sử dụng public static UUID nameUUIDFromBytes(byte[] name). cho loại 4 sử dụng public static UUID randomUUID(). Loại 1 không có sẵn với lớp JDK.
slartibartfast

Không. Tôi nghĩ rằng tôi đã hiểu nó khá nhiều. Trạng thái javadocs: "mặc dù các nhà xây dựng cho phép tạo ra bất kỳ biến thể nào của UUID (được mô tả bên dưới)." và 4 biến thể được liệt kê dưới đây, bao gồm loại 1. Thật vậy, hãy đọc javadoc choclockSequence()
Stephen C

27

Chỉ để mở rộng câu trả lời của Mark Byers bằng một ví dụ:

import java.util.UUID;

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

7

Các câu trả lời khác là chính xác, đặc biệt là một này bởi Stephen C .

Vươn ra ngoài Java

Việc tạo giá trị UUID trong Java bị giới hạn ở Phiên bản 4 (ngẫu nhiên) vì các vấn đề bảo mật.

Nếu bạn muốn các phiên bản khác của UUID, một con đường là để ứng dụng Java của bạn vươn ra ngoài JVM để tạo UUID bằng cách gọi:

  • Tiện ích dòng lệnh Đi
    kèm với gần như mọi hệ điều hành.
    Ví dụ: uuidgenđược tìm thấy trong Mac OS X, BSD và Linux.
  • Máy chủ cơ sở dữ liệu
    Sử dụng JDBC để truy xuất UUID được tạo trên máy chủ cơ sở dữ liệu.
    Ví dụ: uuid-osspphần mở rộng thường được đóng gói với Postgres . Tiện ích mở rộng đó có thể tạo các giá trị Phiên bản 1, 3 và 4 và thêm một vài biến thể:
    • uuid_generate_v1mc() - tạo UUID phiên bản 1 nhưng sử dụng địa chỉ MAC phát đa hướng ngẫu nhiên thay vì địa chỉ MAC thực của máy tính.
    • uuid_generate_v5(namespace uuid, name text) - tạo UUID phiên bản 5, hoạt động giống như UUID phiên bản 3 ngoại trừ SHA-1 được sử dụng làm phương pháp băm.
  • Dịch vụ web
    Ví dụ, Trình tạo UUID tạo Phiên bản 1 & 3 cũng như các giá trị khôngGUID .

3
Tôi có một số vấn đề với câu trả lời của bạn: Đầu tiên, nó đã được chứng minh là sai khi bạn chỉ có thể lấy V4 từ thư viện Java tiêu chuẩn (V3 cũng có thể). Thứ hai, bạn làm cho nó có vẻ như không có tùy chọn nào trong Java ngoài thư viện tiêu chuẩn, cùng với "vì lo ngại bảo mật". Và cuối cùng, nói chung là không hiệu quả (lập trình và / hoặc hiệu suất khôn ngoan) để bắt đầu tùy thuộc vào các nguồn bên ngoài khi có nhiều cách để làm điều đó trong Java (tất nhiên trừ khi bạn cần nó trong đó, ví dụ như là một phần của việc tạo ghi vào máy chủ SQL).
DennisK
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.