2012-06-19 54 views
2

我有超過1億個唯一字符串(VARCHAR(100)UNIQUE在MySQL數據庫中)。現在我使用下面的代碼從它們創建唯一的哈希(VARCHAR(32)UNIQUE),以便減少InnoDB表的索引大小(varchar(100)上的唯一索引大約比on varchar(32)字段大3倍)。Python最短唯一的字符串ID

id = hashlib.md5(str).hexdigest() 

是否有任何其他方法來從這些字符串創建更短的ID並做出合理的唯一性保證?

+0

SHA1?請注意,您可以通過使用摘要的base-64版本而不是十六進制來縮短字符串的長度:'base64.b64encode(hashlib.md5(「foo」)。digest())' –

+1

您可以使用BINARY (16)列存儲MD5散列,不使用十六進制或base64編碼。 –

回答

3

一個簡單的方法是,你可以做md5,然後從中選擇前16個字符,而不是全部32個字符。衝突仍然不會那麼高,並且你將擁有合理的唯一性保證。

2

最簡單的解決方案是將十六進制數據(yor摘要的基數爲16)轉換爲其他數據,例如。與基地64.

如果你同意在某種程度上較高的風險,你可以只使用例如摘要的前十位數字(十六進制)。它會給你16**10(超過10**12)的可能性而不是16**32(超過10**38),但它仍然是巨大的,並且是常用的技術(Git和Github通常使用7位數字來標識提交,afair)。

+0

順便說一句。使用base64編碼的MD5需要22個字符,並且您具有與原始MD5相同的信息。如果從32到22 chatacters滿足你,那麼這是好的。 – Tadeck

0

由於哈希和壓縮非常相似,一個明顯的解決方案是使用壓縮算法來壓縮您的密鑰。這也將保持密鑰的唯一性。

+0

你能提出一種壓縮算法,可以在這樣短的輸入上實現所需的壓縮比嗎? –

+0

請檢查[this](http://stackoverflow.com/questions/1138345/best-compression-algorithm-for-short-text-strings)和[this](http://stackoverflow.com/questions/1192732/really-simple-short-string-compression)帖子 – klearn

4

你可以把它保存爲整數

id_ = int(hashlib.md5(your_str).hexdigest(), 16) 

或者二進制字符串:

id_ = hashlib.md5(your_str).digest() 
相關問題