2012-01-30 56 views
16

Tôi cần tạo ID duy nhất cho ứng dụng của mình. Khi tôi sử dụng (UUID.randomUUID()).toString(), tôi nhận được một mã (suy nghĩ điều này sẽ là duy nhất), mà là rất dài.Tạo ID duy nhất

Tôi không chắc chắn nó độc đáo như thế nào, khi chúng tôi tạo mã với sự trợ giúp của Java Dấu thời gian hoặc chuỗi ngẫu nhiên.

Tôi cần tạo mã duy nhất chỉ có 8-10 ký tự dài (số alpha). Làm thế nào để có được như vậy? Tôi đang sử dụng cơ sở dữ liệu MySQL.

Việc tạo mã duy nhất trên phía cơ sở dữ liệu là cách tốt nhất hoặc chúng tôi có thể tạo các mã ngắn (nhưng duy nhất) này trong Java không?

Bất kỳ đề xuất nào có mã mẫu sẽ rất hữu ích.

+0

bạn có muốn tạo phương pháp riêng để tạo id duy nhất bằng dấu thời gian không? –

+0

Bạn có thể nhận được một số duy nhất và sau đó có thể tăng số đó lên 1 lần trong khi lưu trữ các bản ghi vào DB. – Ved

+2

@Sathish: Tại sao không nhận được chuỗi con() theo độ dài mong muốn của bạn và tiếp tục kiểm tra xem liệu chuỗi mới có bằng với bất kỳ chuỗi nào được gán trước đó hay không. UUID là cách tốt nhất :-) Kính trọng –

Trả lời

21

tôi sử dụng phương pháp từ commons-lang để đạt được điều này:

import org.apache.commons.lang.RandomStringUtils; 

public static final int ID_LENGTH = 10; 

public String generateUniqueId() { 
    return RandomStringUtils.randomAlphanumeric(ID_LENGTH); 
} 

Nếu bạn sử dụng Maven, đảm bảo rằng bạn đã thêm commons-lang để phụ thuộc của dự án:

<dependency> 
    <groupId>commons-lang</groupId> 
    <artifactId>commons-lang</artifactId> 
    <version>2.6</version> 
</dependency> 

Được tạo mã duy nhất trên bên cơ sở dữ liệu là cách tốt nhất hoặc chúng ta có thể tạo ra các mã ngắn (nhưng duy nhất) này trong java?

Điều này tùy thuộc vào bạn và dự án của bạn. Phần tạo id của logic nghiệp vụ? Nếu có và tất cả logic được viết trên Java, hãy viết nó trên Java. Nếu tất cả hoặc một phần nào đó của logic được giao cho cơ sở dữ liệu, thì hãy tạo id ở đó (nhưng trong trường hợp này bạn sẽ có sự phụ thuộc mạnh mẽ vào cơ sở dữ liệu cụ thể).

+0

Hi .. Cảm ơn rất nhiều .. Bằng cách sử dụng randomAlphanumeric(), chúng tôi đang nhận được mã theo chiều dài chúng tôi muốn .. nhưng độc đáo ?? –

+1

'randomAlphanumeric()' tạo chuỗi ký tự ngẫu nhiên và trong hầu hết các trường hợp, nó duy nhất (bạn cũng có thể thử chạy nó trong một vòng lặp và tạo mới trừ khi nó không tồn tại). –

+0

Cảm ơn .. cuối cùng tôi đã sử dụng RandomStringUtils.randomAlphanumeric (10) để tạo mã và kiểm tra sự tồn tại của mã trong cơ sở dữ liệu. Nếu không tồn tại, tôi đang sử dụng nó như là mã duy nhất của tôi .. –

5

Việc tạo mã duy nhất trên phía cơ sở dữ liệu là cách tốt nhất hoặc chúng tôi có thể tạo các mã ngắn (nhưng duy nhất) này trong Java không?

Cơ sở dữ liệu được thiết kế để có thể tạo ID duy nhất khi cần. Tôi nghi ngờ bất cứ điều gì bạn (hoặc tôi) có thể mã sẽ là một 'tốt hơn' biến thể của điều đó.

+0

Cảm ơn bạn. Nếu có, bạn có thể cho tôi một số ví dụ về cách tạo các ID duy nhất cho cơ sở dữ liệu MySQL hay không. –

+2

Hãy thử [bất kỳ điều nào trong số này] (http://www.google.com.au/search?q=generate+unique+IDs+for+MySQL&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en- Hoa Kỳ: chính thức & khách hàng = firefox-a). Tôi không sử dụng DB trên cơ sở hàng ngày, và chưa bao giờ sử dụng MySQL. –

+0

Cảm ơn bạn đã đề xuất google :) –

7

Bạn có tính đến giới hạn cụ thể nào không? Chẳng hạn như tính đơn độc chéo? Bởi vì nếu không, MySQL hoàn toàn có khả năng tự tạo ID, tất cả những gì bạn cần làm là xác định cột autoincrement và không chỉ định nó tại thời điểm chèn (nghĩa là chèn một giá trị NULL cho nó) - ID có sẵn, độc đáo và không yêu cầu bạn làm việc.

Nó sẽ không phải là chuỗi ký tự chữ và số (tôi không chắc chắn nếu bạn đã chỉ định là yêu cầu hoặc hạn chế), nhưng nếu tất cả những gì bạn yêu cầu là duy nhất, thì quá đủ. 8 - 10 ký tự chữ và số không đủ để đảm bảo tính duy nhất trong một chuỗi được tạo ngẫu nhiên, vì vậy bạn phải thực hiện kiểm tra chèn trên cơ sở dữ liệu.

1

Tôi đã viết một dịch vụ đơn giản có thể tạo ra các số dài 64 bit không liên tục duy nhất. Nó có thể được triển khai trên nhiều máy để dự phòng và khả năng mở rộng. Nó sử dụng ZeroMQ để nhắn tin.Để biết thêm thông tin về cách thức hoạt động xem trang github: zUID

0

Hãy nhìn vào: UIDGenerator.java

Bạn có thể tùy chỉnh nó (duy nhất để xử lý duy nhất, hoặc thế giới), nó rất dễ dàng để sử dụng và nhanh chóng:

private static final UIDGenerator SCA_GEN = new UIDGenerator(new ScalableSequence(0, 100)); 
....... 
    SCA_GEN.next(); 

Bạn có thể thay đổi việc thực hiện để giảm kích thước của ID (và thêm cân bằng khác)

xem kết quả điểm chuẩn của tôi tại địa chỉ:

http://zoltran.com/roller/zoltran/entry/generating_a_unique_id

hoặc tự chạy chúng.

+0

Trong trường hợp tôi sử dụng Trình tạo UID, nó sẽ là duy nhất trong ứng dụng java đa cụm, Id đó sẽ là duy nhất ngay cả khi máy chủ được khởi động lại? –

0

Các câu hỏi nếu một phần thế hệ id được thực hiện trong cơ sở dữ liệu hoặc java cuối: Câu hỏi này đã được trả lời bởi bạn tùy thuộc vào yêu cầu của ứng dụng của bạn:

1) Một cách là để đi bởi System.currenTimeMillis (). Nhưng nếu ứng dụng của bạn sẽ làm việc trong nhiều nhóm env, sau đó bạn có thể kết thúc với các giá trị trùng lặp.

http://www2.sys-con.com/itsg/virtualcd/java/archives/0512/Westra/index.html

2) Một cách khác là sử dụng UUID Generator Nó sẽ giúp bạn trong trường hợp bạn có cơ sở dữ liệu khác nhau mà cần phải được sáp nhập. Sử dụng mehtod này, bạn không phải lo lắng về việc sao chép id khi hợp nhất cơ sở dữ liệu.

https://marketplace.informatica.com/solutions/mapping_uuid_using_java

Có thể có các yếu tố khác mà bạn có thể muốn xem xét. Theo phương pháp UUID câu hỏi của bạn sẽ đi.

Các vấn đề liên quan