【问题标题】:Python shortest unique id from strings字符串中的Python最短唯一ID
【发布时间】:2012-06-21 03:56:29
【问题描述】:

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

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

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

【问题讨论】:

  • SHA1?请注意,您可以使用 base-64 版本的摘要而不是十六进制版本来缩短字符串:base64.b64encode(hashlib.md5("foo").digest())
  • 您可以使用 BINARY(16) 列来存储 MD5 哈希,而无需使用十六进制或 base64 编码。

标签: python md5 hashlib


【解决方案1】:

您可以将其保存为整数:

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

或者作为二进制字符串:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 顺便说一句。使用 base64 编码的 MD5 需要 22 个字符,并且您拥有与原始 MD5 相同的信息。如果从 32 到 22 个字符满足您的需求,那没关系。
      【解决方案4】:

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

      【讨论】:

      • 您能否推荐一种压缩算法,可以在如此短的输入上达到要求的压缩率?
      • 请查看thisthis 的帖子
      猜你喜欢
      • 2017-01-01
      • 2016-12-19
      • 1970-01-01
      • 2011-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-05
      • 1970-01-01
      相关资源
      最近更新 更多