PHP CRC32为两个不同的字符串

时间:2015-12-02 05:20:25

标签: php crc32

我正在使用PHP的crc32函数为MongoId生成数字等价物,因为我在mysql搜索中使用这个数字id,因为字符串搜索很慢。

我遇到过一个案例,其中crc32为两个不同的mongoid提供相同的数值。

非常感谢任何帮助或建议。

由于 拉夫

2 个答案:

答案 0 :(得分:1)

除非您的字符串是四个字节或更少,否则不可避免许多字符串将具有任何给定的CRC-32值。如果你甚至只有一个超过2 ^ 32个可能的字符串,那么绝对保证这些字符串中至少有两个将映射到相同的CRC-32。

没有任何帮助或建议。除非可能的字符串少于可能的CRC,否则您不能指望没有冲突。

顺便说一下,你可以用我的spoof code故意构造这样的情况,它允许你给它一组你可以在一个字符串中改变的位,它会告诉你哪些位到翻转以获得所需的CRC。

答案 1 :(得分:1)

@ MarkAdler的回答解释了为什么你会遇到哈希冲突。但如果我在你的鞋子里,我对我能做些什么更感兴趣。

当然,你可以做的是使用一种不同的哈希算法来产生更长的哈希值(更少的碰撞机会),但仍然可以接受。您可以从programmers.stackexchange.com找到this question中几个备选方案的高评价评论。它们都有碰撞(巧合的是CRC32在那个答案的测试集中做得很好),但是你可以在mongoids上尝试其中一些,看看会发生什么。

我还发现this clever suggestion:要生成64位哈希,您可以采用两个不同的 32位哈希算法并连接哈希值(当然这或多或少会减半)哈希的速度。)

更强大的解决方案是编写代码时理解哈希是一个存储桶,有时您会从crc32查询中获得多个结果(或错误的结果)。只需添加第二步,即可检查返回记录的未散列ID。由于只有少数点击,所以它不会花很长时间。

相关问题