我有超过1亿个独特的字符串(在MySQL数据库中为VARCHAR(100)UNIQUE)。现在,我使用下面的代码从它们创建唯一哈希值(VARCHAR(32)UNIQUE),以便缩小InnoDB表索引的大小(在VARCHAR(100)上的唯一索引大约是在VARCHAR(32)字段上的3倍)。
id = hashlib.md5(str).hexdigest()
有没有其他方法可以从这些字符串中创建更短的 ID,并做出合理的唯一性保证?
你可以将其保存为整数:
id_ = int(hashlib.md5(your_str).hexdigest(), 16)
或者作为二进制字符串:
id_ = hashlib.md5(your_str).digest()
一种简单的方法是,您可以先做md5,然后从中选取前16个字符,而不是全部32个字符。冲突仍然不会太高,并且您将得到合理的唯一性保证。
16**10
(超过10**12
)个可能性,而不是16**32
(超过10**38
),但仍然是巨大的,并且是常用的技术(Git和Github通常使用7位数字来标识提交,如果我没记错的话)。由于哈希和压缩非常相似,一个显而易见的解决方案是使用压缩算法来压缩您的键。这将保持密钥的唯一性。
base64.b64encode(hashlib.md5("foo").digest())
。 - Fred Foo