2012-09-24 28 views
7

Devo generare un ID UNICO (solo int) da una stringa alfanumerica.Genera ID univoco da stringa alfanumerica

ad es. Ho security id = 'ABC123DEF' Dovrei essere in grado di generare un ID univoco (solo int) di "ID di sicurezza" in modo che l'ID univoco sia sempre costante.

ad es. ID di sicurezza: ABC123DEF ID int: 9463456892

In modo che possa memorizzare l'ID Int nel database e fare riferimento l'ID di sicurezza da Int ID in qualsiasi momento.

Alcuni esempi: PBG_CD_20120214_.2 | 201202-CMG188963_T | PBG_TD_20120306_.0001 3 esempi: -PIPE separato

+0

Guarda in hashing. – SLaks

+0

Sei molto specifico deve essere un int, ma per favore definisci int? Il numero che hai inserito è troppo grande per un tradizionale int che si riferisce a 32-bit di solito, anche se si inserisce in un lungo. Quali sono i limiti di spazio dell'ID numerico? –

+0

Ciao Jimmy Può essere lungo int. Potrebbe essere che dovrei mettere in questo modo. L'ID generato deve essere in "Numberic (0 - 9)" – Anshul

risposta

1

È possibile codificare ciascun carattere come un numero a due cifre, 0-9 come numeri, 10-35 come A-Z.

Per esempio, 9AC8 sarebbe 09 10 12 08 = 09101208.

EDIT: Per un piccolo numero che si potrebbe usare questo approccio (con psuedocodarlo stile Java):

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

Ho una stringa alfanumerica: come "201202-CMG277440_T" – Anshul

+0

Esiste un limite per quanto grandi possono essere i tuoi numeri? – redolent

+0

No - Nessun limite su quanto può essere grande il numero. – Anshul

21

Basta usare l'algoritmo di hashing Java. Non al 100% unico, ma è possibile utilizzarlo come base e aggiungere qualcosa di garantire l'unicità su un set collisioni molto più piccolo:

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

Al fine di evitare la collisione al 100%, è necessario un numero primo che è più grande della più ampia differenza tra i tuoi personaggi. Quindi per ASCII a 7 bit, è necessario qualcosa di più alto di 128. Quindi anziché 31, usa 131 (il prossimo numero primo dopo 128). La parte che non ho controllato è se l'hash generato si rivelerà più grande della dimensione dei tuoi long ints. Ma puoi prenderlo da lì ...

+0

Penso che funzionerà. Fammi provare. Molte grazie. – Anshul

+3

Non dimenticare di approvare la risposta a beneficio della comunità se funziona – mprivat