我有超过1亿个唯一字符串(MySQL数据库中的VARCHAR(100)UNIQUE)。现在我使用下面的代码从它们创建唯一的哈希值(VARCHAR(32)UNIQUE)以减少InnoDB表的索引大小(varchar(100)上的唯一索引大约是varchar(32)字段的3倍)。
id = hashlib.md5(str).hexdigest()
还有其他方法可以从这些字符串中创建更短的ID并做出合理的唯一性保证吗?
答案 0 :(得分:5)
您可以将其保存为整数:
id_ = int(hashlib.md5(your_str).hexdigest(), 16)
或者作为二进制字符串:
id_ = hashlib.md5(your_str).digest()
答案 1 :(得分:3)
一种粗暴的方式可以是,你可以做md5,然后从它中选出前16个字符,而不是全部32个。碰撞仍然不会那么高,你将有合理的唯一性保证。
答案 2 :(得分:2)
最简单的解决方案是将十六进制数据(yor摘要的基数为16)转换为其他数据,例如。以64为基础。
如果您同意某种程度的高风险,则只能使用例如摘要的前十位(十六进制)。它会为您提供16**10
(超过10**12
)种可能性而不是16**32
(超过10**38
),但它仍然很大并且是常用的技术(Git和Github)通常使用7位数来识别提交,直到。)
答案 3 :(得分:0)
由于散列和压缩非常相似,显而易见的解决方案是使用压缩算法来压缩密钥。这也将保留键的唯一性。