2012-09-24 12 views
7

Potrzebuję wygenerować UNIKALNY id (tylko int) z alfanumerycznego ciągu.Generowanie unikatowego identyfikatora z ciągu alfanumerycznego

np. Mam identyfikator zabezpieczeń = "ABC123DEF" Powinienem być w stanie wygenerować unikalny identyfikator (tylko int) "identyfikatora zabezpieczeń", aby unikalny identyfikator był zawsze stały.

np. bezpieczeństwo ID: ABC123DEF Int ID: 9463456892

Tak, że można przechowywać identyfikator Int w bazie i przekazać identyfikator zabezpieczeń z ID Int każdej chwili.

Niektóre przykłady: PBG_CD_20120214_.2 | 201202-CMG188963_T | PBG_TD_20120306_.0001 3 przykłady: -PIPE oddzielone

+0

Spójrz na haszowanie. – SLaks

+0

Jesteś bardzo konkretny, musi to być int, ale proszę podać int? Liczba, którą umieścisz jest zbyt duża dla tradycyjnej int, która odnosi się do 32-bitowych zwykle, choć pasuje w długim. Jakie są ograniczenia przestrzeni numeru ID? –

+0

Witam Jimmy Może mieć długą int. Być może powinienem postawić w ten sposób. Wygenerowany identyfikator powinien być w "Numeryczny (0 - 9)" – Anshul

Odpowiedz

1

Można zakodować każdy znak jako dwucyfrowy numer, 0-9 jako same liczby, 10-35 jako A-Z.

Na przykład 9AC8 byłoby 09 10 12 08 = 09101208.

EDIT: dla niewielkiej liczby można użyć tego podejścia (z Java stylu psuedocode):

char[] availableChars = ['A', 'B', ... , '0', ... '9', '-', '_', '.']; 
long hash = 0; 
long base = 1; 
for (char c in string.toCharArray()) 
    for (int key=0; key < availableChars.length; key++) 
     if (availableChars[key] != c) 
      continue; 
     hash += base*key; 
     base = base*availableChars.length 

return hash; 
+0

Mam ciąg alfanumeryczny: jak "201202-CMG277440_T" – Anshul

+0

Czy istnieje limit liczby cyfr? – redolent

+0

Nie - bez ograniczeń, jak duża może być ta liczba. – Anshul

21

wystarczy użyć algorytm haszowania Java. Nie 100% niepowtarzalny ale można go używać jako bazy i dodać coś do gwarantują wyjątkowość na znacznie mniejszą zestawu Kolizja:

public static int hash(String s) { 
    int h = 0; 
    for (int i = 0; i < s.length(); i++) { 
     h = 31 * h + s.charAt(i); 
    } 
    return h; 
} 

W celu uniknięcia kolizji 100%, trzeba się doskonałą liczbę, która jest większa niż większa różnica między twoimi postaciami. Tak więc dla 7-bitowego ASCII potrzebujesz czegoś więcej niż 128. Zamiast więc 31, użyj 131 (następna liczba pierwsza po 128). Część, której nie sprawdziłem, to czy wygenerowany skrót będzie większy niż rozmiar twoich długich intów. Ale możesz go zabrać stamtąd ...

+0

Myślę, że to zadziała. Pozwól mi spróbować. Wielkie dzięki. – Anshul

+3

Nie zapomnij o zatwierdzeniu odpowiedzi na korzyść społeczności, jeśli działa – mprivat

Powiązane problemy