Hash 两个类(c1和c2)实现了一个完美的哈希函数(h)。什么';s是c3的最佳哈希函数,在c1和c2上按组合多态

Hash 两个类(c1和c2)实现了一个完美的哈希函数(h)。什么';s是c3的最佳哈希函数,在c1和c2上按组合多态,hash,Hash,由于标题的字数限制,我无法具体说明“完美哈希函数”和“最佳哈希函数”的含义 h、 完美散列函数仅在不可能发生冲突的情况下是完美的,而不是在其分布情况下 c3的散列函数应仅基于其类型为c1和c2的两个字段来实现,并且应能够避免冲突,但不一定提供良好的散列分布 不管答案是什么,我都想解释一下函数背后的数学,以及为什么它避免了碰撞,这样下次我在类似的情况下,我就可以瞄准同样的数学了 (下面的代码是用C#编写的,但问题很普遍,不能授予它[C#]标记) 编辑:请注意,所有涉及的哈希函数都需要返回32位整数

由于标题的字数限制,我无法具体说明“完美哈希函数”和“最佳哈希函数”的含义

h、 完美散列函数仅在不可能发生冲突的情况下是完美的,而不是在其分布情况下

c3
的散列函数应仅基于其类型为
c1
c2
的两个字段来实现,并且应能够避免冲突,但不一定提供良好的散列分布

不管答案是什么,我都想解释一下函数背后的数学,以及为什么它避免了碰撞,这样下次我在类似的情况下,我就可以瞄准同样的数学了

(下面的代码是用C#编写的,但问题很普遍,不能授予它[C#]标记)

编辑:请注意,所有涉及的哈希函数都需要返回32位整数

class C3
{
    C1 _c1Field;
    C2 _c2Field;
    public override int GetHashCode()
    {
        //what to do here?
    }
}
EDIT2:声称我的问题是重复的问题是:根据正常标准,我不想要一个好的散列函数。我想我说得够清楚了,但显然我没有。我需要一个完全忽略分布均匀性的散列函数。我根本不需要关心这个。我只需要一个避免碰撞的函数。我不是要求它完美,也不是要求它永远不会碰撞,那将是愚蠢的。我要的是一个函数,给定两幅图像,在我们的理想(和纯粹假设的)h函数下,输出一幅图像,在h函数下,与另一对不同的图像碰撞的可能性最小


我不知道这类函数的其他名称,所以我称它为散列函数。问题可能在于我缺乏专业词汇,因为我只是出于爱好而编写代码,不是为了谋生。

你可以将
\u c1Field
\u c2Field
哈希为32位。将其中一个左移位32位,然后将左移位值与未移位值相加,得到64位整数。然后,您可以根据需要使用标准哈希函数将64位整数哈希到32位。

当您说c1和c2实现完美的哈希函数时,您的意思是为了尽可能减少哈希值的数量吗?假设您只需要将c1和c2哈希到32位。然后你可以做32左移位的散列(_c1Field)和散列(_c2Field),然后你可以按位为C3创建一个64位的散列,或者这不是一个一般的答案,想象一下C1和C2散列使用了int的全部范围。@RyanStout显然,C标记适用于此。我需要重写
GetHashCode
方法,因此我需要c3哈希值仅为32位。很抱歉,我将对问题进行编辑以使其更清楚。@FinnTheHuman如果我有一个输出范围为1到10的散列函数,有什么数学魔术可以为20个项目提供无冲突的输出?有很多这样的函数,有效的Java有一个很好的例子,这个问题有很多变体,例如