由于标题上的字数限制,我无法指定我的意思"完美的哈希函数"和#34;最佳哈希函数"。
h ,完美的哈希函数只对碰撞的不可能性而言是完美的,而不是它的分布。
c3
的哈希函数应该仅基于其c1
和c2
类型的两个字段来实现,它应该能够避免冲突,但不一定能提供好的哈希的分布。
无论答案是什么,我想对函数背后的数学进行解释,以及为什么它避免碰撞,所以我可以在下次遇到类似情况时瞄准相同的数学。
(下面的代码用C#编写,但问题很普遍,不能将其授予[C#]标签)
编辑:请注意,所涉及的所有散列函数都需要返回32位整数。
class C3
{
C1 _c1Field;
C2 _c2Field;
public override int GetHashCode()
{
//what to do here?
}
}
EDIT2:关于声称我的问题的重复是:我根据正常标准不想要一个好的哈希函数。我以为我说得那么清楚,但显然我没有。我需要一个完全忽略分布均匀性的哈希函数。我根本不需要关心这一点。我只需要一个避免冲突的功能。我不是要求它完美,并且从不碰撞,那将是愚蠢的。我要求的功能是,在理想(和纯粹假设的) h 功能下给出两个图像,输出的图像与另一对不同的图像碰撞的可能性最小。 ħ
我不知道这种功能的任何其他名称,因此我将其称为哈希函数。问题可能在于我缺乏专业词汇,因为我只是为了爱好而出于爱,而不是为了生活。
答案 0 :(得分:0)
您可以将_c1Field
和_c2Field
都哈希为32位。将其中一个向左移位32位,然后将左移位值添加到未移位值以获得64位整数。然后,您可以根据需要使用标准散列函数将64位整数散列为32位。