2011-07-05 35 views
8

Tôi đang cố tạo một số nhận dạng duy nhất có độ dài cố định, chẳng hạn như các ID được tạo bởi Megaupload cho các tệp đã tải lên.Làm thế nào để tạo ra một định danh duy nhất của một chiều dài cố định trong Java?

Ví dụ:

  • ALGYTAB5
  • BCLD23A6

Trong ví dụ này sử dụng từ A-Z và 0-9 và với chiều dài cố định là 8 tổng kết hợp khác nhau là 2.821.109.907.456.

Điều gì xảy ra nếu một trong các id được tạo đã được sử dụng. Những id sẽ được lưu trữ trong một cơ sở dữ liệu và nó không nên được sử dụng nhiều hơn một lần.

Làm cách nào để có thể đạt được điều đó trong Java?

Cảm ơn bạn.

+0

http://stackoverflow.com/questions/192920/generating-a-globally-unique-identifier-in-java http://download.oracle.com/javase/1,5.0/docs/api/java/ util/UUID.html – Jacob

+0

Lý do cơ bản cho việc không muốn sử dụng ID gia tăng tự động là gì? –

+2

Sẽ rất khó đoán. –

Trả lời

4

Hmm ... Bạn có thể bắt chước một cách nhỏ hơn GUID theo cách sau. Để 4 byte đầu tiên của chuỗi của bạn là thời gian hiện tại được mã hóa - giây trôi qua sau Unix. Và 4 cuối cùng chỉ là một sự kết hợp ngẫu nhiên. Trong trường hợp này, cách duy nhất hai ID trùng khớp là chúng được xây dựng ở cùng một giây. Và cơ hội đó sẽ rất thấp vì 4 nhân vật ngẫu nhiên khác.

Mã giả:

get current time (4 byte integer 
id[0] = 1st byte of current time (encoded to be a digit or a letter) 
id[1] = 2nd 
id[2] = 3rd 
id[3] = 4th 
id[4] = random character 
id[5] = random character 
id[6] = random character 
id[7] = random character 
0

Chúng tôi đang sử dụng cơ sở dữ liệu để kiểm tra xem họ đã tồn tại. Nếu số lượng ID thấp so với số lượng có thể, bạn nên tương đối an toàn.

Bạn cũng có thể xem lớp UUID (mặc dù đó là UUID 16 byte).

+0

http://download.oracle.com/javase/1,5.0/docs/api/java/util/UUID.html điều này có thể giúp – lollancf37

+1

@ lollancf37 cảm ơn bạn đã thêm liên kết, mặc dù tôi muốn thêm Java 6 hiện tại phiên bản: http://download.oracle.com/javase/6/docs/api/java/util/UUID.html – Thomas

0

Có vẻ như một công việc cho một hash function. Bạn không được đảm bảo 100% rằng hàm băm sẽ trả về một mã định danh duy nhất, nhưng nó hoạt động phần lớn thời gian. Các xung đột băm phải được xử lý riêng, nhưng có nhiều kỹ thuật tiêu chuẩn để bạn xem xét.

Cụ thể cách bạn xử lý các xung đột phụ thuộc vào những gì bạn đang sử dụng số nhận dạng duy nhất này. Nếu đó là một định danh một chiều đơn giản, nơi bạn cung cấp cho chương trình ID của bạn và nó trả về dữ liệu, thì bạn có thể chỉ cần sử dụng ID có sẵn tiếp theo trong trường hợp xảy ra xung đột.

1

Tôi đã cố gắng @ giải pháp Armen của tuy nhiên tôi muốn cung cấp cho một giải pháp khác

UUID idOne = UUID.randomUUID(); 
UUID idTwo = UUID.randomUUID(); 
UUID idThree = UUID.randomUUID(); 
UUID idFour = UUID.randomUUID(); 

String time = idOne.toString().replace("-", ""); 
String time2 = idTwo.toString().replace("-", ""); 
String time3 = idThree.toString().replace("-", ""); 
String time4 = idFour.toString().replace("-", ""); 

StringBuffer data = new StringBuffer(); 
data.append(time); 
data.append(time2); 
data.append(time3); 
data.append(time4); 

    SecureRandom random = new SecureRandom(); 
int beginIndex = random.nextInt(100);  //Begin index + length of your string < data length 
int endIndex = beginIndex + 10;   //Length of string which you want 

String yourID = data.substring(beginIndex, endIndex); 

Hope trợ giúp này!

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