Python从字符串中生成最短的唯一ID

10

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

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

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

SHA1?请注意,您可以使用基于64位编码的摘要版本而不是十六进制版本来使字符串更短:base64.b64encode(hashlib.md5("foo").digest()) - Fred Foo
1
你可以使用一个BINARY(16)列来存储MD5哈希值,而无需进行十六进制或Base64编码。 - Janne Karila
4个回答

13
你可以将它保存为整数:

你可以将其保存为整数:

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

或者作为二进制字符串:

id_ = hashlib.md5(your_str).digest()

3

一种简单的方法是,您可以先做md5,然后从中选取前16个字符,而不是全部32个字符。冲突仍然不会太高,并且您将得到合理的唯一性保证。


2
最简单的解决方案是将十六进制数据(您的摘要具有16进制基数)转换为其他东西,例如使用64进制。
如果您同意承担某种程度的风险,可以仅使用摘要的前十个数字(十六进制)。这将给您提供16**10(超过10**12)个可能性,而不是16**32(超过10**38),但仍然是巨大的,并且是常用的技术(Git和Github通常使用7位数字来标识提交,如果我没记错的话)。

顺便提一下,使用base64编码的MD5需要22个字符,而且你可以得到与原始MD5相同的信息。如果从32个字符缩短到22个字符可以满足您的需求,那么这是可以的。 - Tadeck

0

由于哈希和压缩非常相似,一个显而易见的解决方案是使用压缩算法来压缩您的键。这将保持密钥的唯一性。


1
你能推荐一个压缩算法,可以在这样短的输入上实现所需的压缩比吗? - Janne Karila

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接