查找具有给定散列函数的碰撞字符串

时间:2016-11-30 18:15:04

标签: c++ algorithm hash hash-collision string-hashing

我有一个字符串anna,其中字符串中的字符值为a = 1, n = 14 ( You can compute the value of other chars like ( char - 96 ),哈希函数如下所示:

int hashCode( string s ) // s = "anna";
{
    k = 0;
    for ( int i = 0; i < s.length(); i++ )
      k = ( 7 * k + 3 * s[i] ) % 61;
    return k;
}

如何找到发生碰撞的长度为3的字符串(智能的东西)?我想到的唯一方法是计算k的{​​{1}} anna,然后以某种方式考虑另一个长度为3的字符串29

1 个答案:

答案 0 :(得分:4)

为什么不简单地生成长度为3的所有字符串并计算它们的哈希值(事实上,当可以达到所有61个可能的哈希函数值时,你可以停止)?选项数量不是太大。

一种可能的优化:如果你需要回答多个查询(比如给定一个字符串,找到一个长度为3且字符串值与hash函数相同的字符串),你可以生成长度为3的所有字符串并计算它们的哈希值一次到构建地图hash -> a string of length 3 with this hash。获得此映射后,查找长度为3且与给定散列具有相同散列的字符串只是一次映射查找。