python - 用于短唯一内容 ID 的散列算法
问题描述
我想知道用于为内容项列表创建短 + 唯一 ID 的最佳哈希算法是什么。每个内容项都是 100-500kb 大小的 ascii 文件。
我的要求是:
必须尽可能短,我存储 id 的空间非常有限,并希望让它们每个都说 < 10 个字符(当表示为 ascii 时)
必须是唯一的,即没有碰撞或至少发生碰撞的可能性可以忽略不计
我不需要它是加密安全的
我不需要它太快(每个内容项都很小)
我正在尝试在 python 中实现这一点,所以最好是一个具有 python 实现的算法。
解决方案
在任何其他建议中,我目前决定使用以下方法。我正在采用 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")
推荐阅读
- azure-devops - 未找到具有指定模式的包:d:\a\r1\a\**\*.zip -- 解决方案
- reactjs - 为什么我得到 NaN ?应用程序似乎可以工作,但起点是 NaN。我该如何解决这个问题?
- sql - 如何在条件下选择所有行但加入信息
- c - 如何在函数之间更改指针值
- docker - 当我尝试通过 https 从一个容器连接到另一个容器时出现“连接被拒绝”
- c++ - 如何找到 -lm lib 并将其包含在 CMake 中?
- php - SSH2_Exec 执行命令的时间太长。- PHP
- python - 如何优化人工神经网络的准确性
- java - 为什么我的程序读取的行数比实际少一行?为什么我的数组只接收一个?
- python - 如何临时更改 kubernetes pod 的环境变量?