我有一个字符串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
。
答案 0 :(得分:4)
为什么不简单地生成长度为3的所有字符串并计算它们的哈希值(事实上,当可以达到所有61个可能的哈希函数值时,你可以停止)?选项数量不是太大。
一种可能的优化:如果你需要回答多个查询(比如给定一个字符串,找到一个长度为3且字符串值与hash函数相同的字符串),你可以生成长度为3的所有字符串并计算它们的哈希值一次到构建地图hash -> a string of length 3 with this hash
。获得此映射后,查找长度为3且与给定散列具有相同散列的字符串只是一次映射查找。