【发布时间】:2013-08-18 02:55:54
【问题描述】:
我通过散列包含所有这些信息的字符串,并比较散列对象的十六进制摘要来比较个人的个人信息,特别是他们的姓名、出生日期、性别和种族。这会产生一个 32 位的十六进制数,我将其用作数据库中的主键。例如,使用我的识别字符串将像这样工作:
>> import hashlib
>> id_string = "BrianPeterson08041993MW"
>> byte_string = id_string.encode('utf-8')
>> hash_id = hashlib.md5(bytesring).hexdigest()
>> print(hash_id)
'3b807ad8a8b3a3569f098a575091bc79'
此时,我正在尝试确定碰撞风险。我的理解是 MD5 没有明显的碰撞风险,至少对于我的相对较小的字符串(长度约为 20-40 个字符)而言。但是,我使用的不是 128 位摘要对象,而是 32 位十六进制摘要。
现在,我相信 hexdigest 是对摘要的压缩(也就是说,它存储在更少的字符中),那么在比较 hexdigest 时不会增加冲突的风险吗?还是我不在基地?
【问题讨论】:
-
32 个字符·4 位/字符 = 128 位
-
啊。那么 hexdigest 是表示哈希的正确方式,并且不会增加非唯一性的风险?
-
对。我想我的问题是:不同的表示是否有不同的机会是非唯一的,这取决于他们使用多少信息单元来进行表示与原始消息需要多少信息单元进行编码?如果是这样,最好的表示是什么?嗯,让我在你的下一个答案前言:像我 10 岁一样跟我说话。
-
只是要知道:散列的大小与您的字符串几乎相同...为什么要计算它,而不是将其用作密钥?