一千萬個為什麽

搜索

如何將字符串鍵映射到唯一的整數ID?

我有一些數據來自數據源的轉儲,其中字符串自然鍵很長(最多60個字符)並且與最終用戶無關。我在網址中使用此密鑰。這使得網址太長並且用戶不友好。

我想將字符串鍵轉換為具有以下要求的整數:

源數據集將隨時間而變化。

ID應為:

  • 非負整數
  • 即使輸入鍵組改變也是唯一且恒定的
  • 最好是可逆的回到關鍵(不是強烈的要求)

每次都從頭開始重建數據庫,因此我不記得已經分配的ID並將新數據集與現有ID匹配,並為添加的密鑰生成順序ID。

目前有大約30000個不同的鍵,並且該組不斷增長。

如何實現將字符串鍵映射到整數ID的函數?

我曾經想過:

1. Built-in string.GetHashCode:

ID(key)= Math.Abs​​(key.GetHashCode())

  • 不保證是唯一的
  • (不可逆)

1.1 "Re-hashing" the built-in GetHashCode until a unique ID is generated to prevent collisions.

    如果將某些沖突添加到輸入數據集的開頭,則
  • 現有ID可能會更改

2. a perfect hashing function

  • 如果輸入集更改
  • ,我不確定這是否可以生成常量ID
  • (不可逆)

3. translate to base 36/64/??

  • 不會縮短長按鍵

還有什麽其他選擇?

最佳答案

Base64編碼的sha1sum是27個字符。 base64(md5(...))是22個字符。任何較小的,你將有不可忽視的碰撞風險。

當輸入組發生變化時,無法實現完美的散列函數。

轉載註明原文: 如何將字符串鍵映射到唯一的整數ID?