【问题标题】:Hashing Algorithm to use for short unique content ID用于短唯一内容 ID 的散列算法
【发布时间】:2020-06-11 19:17:45
【问题描述】:

我想知道用于为内容项列表创建短 + 唯一 ID 的最佳哈希算法是什么。每个内容项都是 100-500kb 大小的 ascii 文件。

我的要求是:

  • 必须尽可能短,我存储 id 的空间非常有限,并希望让它们每个都说

  • 必须是唯一的,即没有碰撞或至少有可忽略不计的碰撞机会

  • 我不需要它是加密安全的

  • 我不需要太快(每个内容项都很小)

我正在尝试在 python 中实现这一点,所以最好是一个具有 python 实现的算法。

【问题讨论】:

  • 其实你解释了常规计数器。

标签: python hash


【解决方案1】:

对于任何其他建议,我目前决定使用以下方法。我正在采用 blake2 散列算法来创建基于文件内容的加密安全十六进制散列,以最大限度地减少冲突的机会。然后我使用 base64 编码将其映射到一个 ascii 字符集,我只取其前 8 位数字。

假设这些数字将完全随机化,从而给出哈希可以采用的 64^8 种组合。我预测我将拥有的内容项数量的上限是 50k,这使我有至少 1 次碰撞的概率为 0.00044%,我认为这对于我的用例来说足够低(可以始终高达 9 或10 位数字(如果将来需要)。

import hashlib
import base64

def get_hash(byte_content, size=8):
    hash_bytes = hashlib.blake2b(byte_content,digest_size=size * 3).digest()
    hash64 = base64.b64encode(hash_bytes).decode("utf-8")[:size]
    return hash64

# Example of use
get_hash(b"some random binary object")

【讨论】:

  • 理论上,您还可以通过使用 base85 编码而不是 64 来提高无冲突的概率,但是我受限于数据库将在字段名称中接受的字符集。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-14
  • 1970-01-01
  • 2011-06-26
相关资源
最近更新 更多