我想知道什么是最好的哈希算法来为内容项目列表创建短+唯一的id。 每个内容项目都是100-500kb的ascii文件。
我的要求是。
必须尽可能的短,我的存储空间非常有限 我想让它们保持在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")