【发布时间】: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 所说,“运行它”。在每个函数中抛出一堆常见的字符串,看看会发生什么。更好的是,用笔和纸完成这个程序,看看如何它是如何工作的。