有两个相等的字符串会给出相同的哈希值

Posted

技术标签:

【中文标题】有两个相等的字符串会给出相同的哈希值【英文标题】:Will hashing two eual strings give same hash value 【发布时间】:2018-05-21 08:00:50 【问题描述】:

我需要匿名化 mysql 数据库中的个人数据。问题是我仍然需要能够将两个人匿名化后联系在一起。

我认为这可以通过散列他们的社会安全号码或电子邮件地址来完成,这导致了我的问题:

当散列两个相等的字符串(s1 和 s1)时,我得到两个散列值(h1 和 h2),我怎么能确定:

1) 哈希值相等 (h1 = h2)

2) 不等于 (s3 = s1) 会产生相同的哈希值

【问题讨论】:

散列函数理论上可以发生冲突。在这一点上,使用每个用户的 SSN 作为唯一标识符对我来说似乎已经足够了。为什么需要散列来比较用户? 您的要求是加密哈希函数的要求。如果两个相等的字符串没有输出相同的哈希值,那么您的哈希函数就会损坏。同样,如果两个不相等的字符串产生相同的哈希(称为冲突),那么您的哈希函数也会损坏。 @Robbie 大多数情况下,我认为您会假设至少有可能发生碰撞,并且只是为这种情况做计划。 @TimBiegeleisen 同一个用户(同一个 SSN)可以在同一个数据库表中有多个条目。出于统计原因,即使在 SSN 被匿名化后,我也需要能够连接它们——这就是我考虑散列 SSN 的原因 【参考方案1】:

1) 相同的字符串总是会产生相同的哈希值 2)如果您选择与数据量相比较小的哈希长度,理论上不同的字符串可能会产生相同的哈希。但使用默认哈希长度(32 或 40)不会导致此类问题。

【讨论】:

【参考方案2】:

1) (h1 = h2) 对于每个定义的相等字符串(s1 和 s2)总是正确的,当使用正确的散列函数时。

2) 两个不同的字符串可以有相同的哈希值。这被称为“碰撞”。概率取决于使用的散列函数和生成的散列的长度。以 MD5 为例,有用于查找冲突的网站和表格,这非常有趣。

我不确定你所说的将人们联系在一起是什么意思,或者你的要求是什么,所以我无法帮助你。但是你可以用他们的 id 把两个人联系起来。

【讨论】:

以上是关于有两个相等的字符串会给出相同的哈希值的主要内容,如果未能解决你的问题,请参考以下文章

以任何顺序给出的相同字符集的唯一哈希?

比较相等的字符串在哈希中找不到相同的对象

HDU 5782 Cycle(KMP+哈希)

hash算法

PHP 两字符串比较,值相同 对比却不相等

ACM入门之哈希