我有超過1億個唯一字符串(VARCHAR(100)UNIQUE在MySQL數據庫中)。現在我使用下面的代碼從它們創建唯一的哈希(VARCHAR(32)UNIQUE),以便減少InnoDB表的索引大小(varchar(100)上的唯一索引大約比on varchar(32)字段大3倍)。Python最短唯一的字符串ID
id = hashlib.md5(str).hexdigest()
是否有任何其他方法來從這些字符串創建更短的ID並做出合理的唯一性保證?
我有超過1億個唯一字符串(VARCHAR(100)UNIQUE在MySQL數據庫中)。現在我使用下面的代碼從它們創建唯一的哈希(VARCHAR(32)UNIQUE),以便減少InnoDB表的索引大小(varchar(100)上的唯一索引大約比on varchar(32)字段大3倍)。Python最短唯一的字符串ID
id = hashlib.md5(str).hexdigest()
是否有任何其他方法來從這些字符串創建更短的ID並做出合理的唯一性保證?
一個簡單的方法是,你可以做md5,然後從中選擇前16個字符,而不是全部32個字符。衝突仍然不會那麼高,並且你將擁有合理的唯一性保證。
最簡單的解決方案是將十六進制數據(yor摘要的基數爲16)轉換爲其他數據,例如。與基地64.
如果你同意在某種程度上較高的風險,你可以只使用例如摘要的前十位數字(十六進制)。它會給你16**10
(超過10**12
)的可能性而不是16**32
(超過10**38
),但它仍然是巨大的,並且是常用的技術(Git和Github通常使用7位數字來標識提交,afair)。
順便說一句。使用base64編碼的MD5需要22個字符,並且您具有與原始MD5相同的信息。如果從32到22 chatacters滿足你,那麼這是好的。 – Tadeck
由於哈希和壓縮非常相似,一個明顯的解決方案是使用壓縮算法來壓縮您的密鑰。這也將保持密鑰的唯一性。
你能提出一種壓縮算法,可以在這樣短的輸入上實現所需的壓縮比嗎? –
請檢查[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
你可以把它保存爲整數
id_ = int(hashlib.md5(your_str).hexdigest(), 16)
或者二進制字符串:
id_ = hashlib.md5(your_str).digest()
SHA1?請注意,您可以通過使用摘要的base-64版本而不是十六進制來縮短字符串的長度:'base64.b64encode(hashlib.md5(「foo」)。digest())' –
您可以使用BINARY (16)列存儲MD5散列,不使用十六進制或base64編碼。 –