2012-09-24 518 views
7

我需要從字母數字字符串生成唯一標識(僅限於int)。從字母數字字符串生成唯一標識

例如我有安全ID ='ABC123DEF' 我應該能夠生成一個唯一的ID(int唯一)的「安全ID」,以便唯一的ID始終是恆定的。

例如 安全ID:ABC123DEF Int ID:9463456892

因此,我可以將Int ID存儲在數據庫中,並隨時從Int ID中引用安全ID。

一些示例: PBG_CD_20120214_.2 | 201202-CMG188963_T | PBG_TD_20120306_.0001 3個示例:-PIPE分開

+0

研究哈希。 – SLaks

+0

你很具體,它必須是一個整數,但請定義int?您輸入的數字對於傳統的int來說太大了,通常是指32位,儘管長度很長。數字標識的空間限制是什麼? –

+0

Hi Jimmy 它可以是Long int。可能是我應該這樣做。 生成的ID應該在「Numberic(0 - 9)」 – Anshul

回答

1

您可以將每個字符編碼爲兩位數字,0-9爲數字本身,10-35爲A-Z。

例如,9AC8是09 10 12 08 = 09101208.

編輯: 對於一個小數目,你可以使用這種方法(與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

我有一個字母數字字符串:像「201202-CMG277440_T」 – Anshul

+0

是否有限制您的數字可以有多大? – redolent

+0

否 - 不限制可以有多大。 – Anshul

21

只需使用Java哈希算法。不是100%的唯一,但你可以使用它作爲一個基礎,添加了一些保證一個更小的碰撞集獨特性:

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

爲了避免碰撞的100%,你需要一個素數比越大你的角色差別更大。因此,對於7位ASCII,您需要高於128的值。因此,不要使用31,請使用131(128之後的下一個素數)。我沒有檢查過的部分是,如果生成的哈希將大於您的長整數的大小。但你可以從那裏拿...

+0

我認爲這是行得通的。讓我嘗試。非常感謝。 – Anshul

+3

不要忘記批准爲社區的利益的答案,如果它的作品 – mprivat