【问题标题】:Two words hash to the same value [closed]两个词散列到相同的值[关闭]
【发布时间】:2013-05-27 03:11:58
【问题描述】:

举两个单词的例子,它们使用 stringHash1 散列到相同的值,但使用 stringHash2 散列到不同的值。

我的答案是 car 和 camera 因为前两个字母是相同的 ascii 值但不确定?

int stringHash1(char * str)
{
    int i;
    int r = 0;
    for (i = 0; str[i] != '\0'; i++)
        r += str[i];
    return r;
}

/*the second hashing function you can use*/
int stringHash2(char * str)
{
    int i;
    int r = 0;
    for (i = 0; str[i] != '\0'; i++)
        r += (i+1) * str[i];
    return r;
}

【问题讨论】:

  • 这听起来像是高度本地化的作业帮助(编辑:最后一部分还不错;关于高度本地化的第一部分是)。
  • 是什么让您认为这两个哈希函数中的任何一个都只查看字符串的前两个字符?此外,如果您运行代码,您会看到“car”和“camera”使用这两个函数散列为不同的值。
  • 展示你的作品,你就会知道你是否正确。有很多地方可以轻松查看,例如 ideone.com
  • 如果您指出教授的明显错误,您可能会获得额外的荣誉:这两个哈希函数都会为长字符串调用未定义的行为。对于第一个,它必须很长,但对于第二个,您可以使用相当短的字符串开始点击 UB,特别是如果 int 是允许的最小大小(16 位)。
  • 如果你想学习这些东西,而不仅仅是获得分数,你最好的选择是,正如@djechlin 所说,“运行它”。在每个函数中抛出一堆常见的字符串,看看会发生什么。更好的是,用笔和纸完成这个程序,看看如何它是如何工作的。

标签: c hash


【解决方案1】:

第一个函数只添加字符值,这意味着反转字符串(或以其他方式重新排列字母)无效;另一个在生成哈希值时还包括每个字符的索引,使其更能抵抗重新排序。

所以:

hash1(ab) = 195
hash1(ba) = 195
hash2(ab) = 293
hash2(ba) = 292

【讨论】:

  • 任何属于字谜的作品都会给出相同的哈希值。 (除了许多不是字谜的词。)
  • @StevenBurnap 是的,字符串反转只是没有效果的字符串转换的一个例子;-)
  • @StevenBurnap 这取决于你是否认为“lol eh”是“hello”的字谜......
猜你喜欢
  • 2018-07-27
  • 1970-01-01
  • 2021-02-22
  • 2020-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
相关资源
最近更新 更多