2011-07-05 12 views
8

Próbuję wygenerować unikalny identyfikator o stałej długości, taki jak identyfikatory generowane przez Megaupload dla przesłanych plików.Jak wygenerować unikalny identyfikator stałej długości w Javie?

Na przykład

  • ALGYTAB5
  • BCLD23A6

W tym przykładzie, stosując od A-Z i 0-9 i o stałej długości 8 całkowite różne kombinacje 2,821,109,907,456.

Co jeśli jeden z wygenerowanych identyfikatorów jest już zajęty. Te identyfikatory będą przechowywane w bazie danych i nie powinny być używane więcej niż jeden raz.

Jak mogę to osiągnąć w Javie?

Dziękuję.

+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

Jakie są powody, dla których nie chcesz używać automatycznie zwiększających się identyfikatorów? –

+2

To powinno być trudne do odgadnięcia. –

Odpowiedz

4

Hmm ... Można naśladować mniejszy GUID w następujący sposób. Niech pierwsze 4 bajty twojego łańcucha będą zakodowanym bieżącym czasem - sekundy minęły po Unixie. A ostatnie 4 to tylko przypadkowa kombinacja. W tym przypadku jedynym sposobem na identyfikację dwóch ID jest to, że zostały zbudowane w tej samej sekundzie. Szanse na to były bardzo niskie ze względu na pozostałe 4 losowe postacie.

Pseudokod:

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

Używamy bazy danych, aby sprawdzić, czy one już istnieją. Jeśli liczba identyfikatorów jest niska w porównaniu z możliwą liczbą, powinieneś być względnie bezpieczny.

Możesz również rzucić okiem na klasę UUID (chociaż są to 16-bajtowe identyfikatory UUID).

+0

http://download.oracle.com/javase/1,5.0/docs/api/java/util/UUID.html to może pomóc – lollancf37

+1

@ lollancf37 dzięki za dodanie linku, chociaż wolę dodać aktualną Javę 6 wersja: http://download.oracle.com/javase/6/docs/api/java/util/UUID.html – Thomas

0

Brzmi jak zadanie dla hash function. Nie masz 100% gwarancji, że funkcja skrótu zwróci unikalny identyfikator, ale działa przez większość czasu. Kolizje skrótu muszą być rozpatrywane osobno, ale istnieje wiele standardowych technik, którymi można się przyjrzeć.

Sposób radzenia sobie z kolizjami zależy od tego, do czego używasz tego unikalnego identyfikatora. Jeśli jest to prosty jednokierunkowy identyfikator, w którym podajesz programowi identyfikator, a następnie zwraca dane, możesz po prostu użyć następnego dostępnego identyfikatora w przypadku kolizji.

1

Próbowałem @ rozwiązania Armen jest jednak chciałbym dać Innym rozwiązaniem

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); 

nadzieję, że to pomaga!

Powiązane problemy