8

我有超过 1 亿个唯一字符串(MySQL 数据库中的 VARCHAR(100) UNIQUE)。现在我使用下面的代码从它们创建唯一的哈希(VARCHAR(32)UNIQUE),以减少 InnoDB 表的索引大小(varchar(100)上的唯一索引大约是 varchar(32)字段的 3 倍)。

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

有没有其他方法可以从这些字符串创建更短的 id 并做出合理的唯一性保证?

4

4 回答 4

10

您可以将其保存为整数:

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

或作为二进制字符串:

id_ = hashlib.md5(your_str).digest()
于 2012-06-19T07:03:25.257 回答
2

一种粗略的方法是,您可以执行 md5,然后从中选择前 16 个字符,而不是全部 32 个字符。碰撞仍然不会那么高,并且您将获得合理的唯一性保证。

于 2012-06-19T06:23:52.553 回答
2

最简单的解决方案是将十六进制数据(您的摘要以 16 为基数)转换为其他内容,例如。以 64 为基数。

如果您同意某种程度的较高风险,您可以只使用摘要的前十位数字(十六进制)。它会给你16**10(超过10**12)可能性而不是16**32(超过10**38),但它仍然是巨大的并且是常用的技术(Git 和 Github 通常使用 7 位数字来识别提交,公平的)。

于 2012-06-19T06:32:15.680 回答
0

由于散列和压缩非常相似,一个明显的解决方案是使用压缩算法来压缩您的密钥。这也将保留密钥的唯一性。

于 2012-06-19T06:33:13.807 回答