2012-09-24 12 views
7

Ich muss eine eindeutige ID (nur int) aus einer alphanumerischen Zeichenfolge generieren.Eindeutige ID aus alphanumerischer Zeichenfolge generieren

z.B. Ich habe Sicherheits-ID = 'ABC123DEF' Ich sollte in der Lage sein, eine eindeutige ID (nur int) von "Sicherheits-ID" zu generieren, so dass die eindeutige ID immer konstant ist.

z.B. Sicherheits-ID: ABC123DEF Int ID: 9463456892

So dass ich die Int-ID in der Datenbank speichern und die Sicherheits-ID von Int ID jederzeit beziehen kann.

Einige Beispiele: PBG_CD_20120214_.2 | 201202-CMG188963_T | PBG_TD_20120306_.0001 3 Beispiele: -PIPE getrennt

+0

Schauen Sie in Hashing. – SLaks

+0

Sie sind sehr spezifisch, es muss ein int sein, aber bitte definieren int? Die Zahl, die Sie setzen, ist zu groß für einen traditionellen int, der normalerweise auf 32 Bits verweist, obwohl er in einen langen passt. Was sind die räumlichen Beschränkungen der numerischen ID? –

+0

Hallo Jimmy Es kann lange Int sein. Vielleicht sollte ich es so machen. Die generierte ID sollte in "Numberic (0 - 9)" sein. – Anshul

Antwort

1

Sie könnten jedes Zeichen als zweistellige Zahl codieren, 0-9 als Zahlen selbst, 10-35 als A-Z.

Zum Beispiel würde 9AC8 09 seine 10 12 08 = 09101208.

EDIT: Für eine kleine Anzahl Sie diesen Ansatz (mit Java-Stil psuedocode) verwenden:

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

Ich habe eine alphanumerische Zeichenfolge: Wie "201202-CMG277440_T" – Anshul

+0

Gibt es eine Grenze für die Größe Ihrer Zahlen? – redolent

+0

Nein - Nein Einschränkung, wie groß die Nummer sein darf. – Anshul

21

Verwenden Sie einfach der Java-Hashalgorithmus. Nicht 100% einzigartig, aber man kann es als Basis verwenden und etwas hinzufügen Einzigartigkeit auf einem viel kleineren Kollisionssatz garantieren:

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

Um Kollision zu 100% zu vermeiden, müssen Sie eine Primzahl, die größer als die ist größerer Unterschied zwischen deinen Charakteren. Für 7-Bit-ASCII benötigen Sie etwas höher als 128. Verwenden Sie statt 31 also 131 (die nächste Primzahl nach 128). Der Teil, den ich nicht überprüft habe, ist, ob der generierte Hashwert größer als die Größe Ihres Long-Ints wird. Aber Sie können es von dort nehmen ...

+0

Ich denke, das wird funktionieren. Lass es mich versuchen. Danke vielmals. – Anshul

+3

Vergessen Sie nicht, die Antwort zugunsten der Gemeinschaft zu genehmigen, wenn es funktioniert – mprivat