我有一个Rectangle类。它有长度,宽度和面积(所有整数)。我想散列它,使得具有相同长度和宽度的每个矩形都散列到相同的值。有什么方法可以做到这一点?
编辑:我理解它是一个广泛的问题。这就是为什么我要求“a”方式来做到这一点。不是最好的方式。答案 0 :(得分:1)
一个好的简单方案是计算一对整数的哈希值,如下所示:
hash = length * CONSTANT + width
根据经验,如果CONSTANT
是素数,您将获得最佳结果(即最少数量的碰撞)。很多人 1 推荐的值类似于31
,但最佳选择取决于length
和{{1}的最可能范围价值。如果它们是严格限制的,并且足够小,那么你可以做得比width
更好。
但是,31
对于实际目的来说可能已经足够了 2 。此级别的一些冲突不太可能产生显着的性能差异,即使是完美的散列函数也不能消除散列表级别的冲突......您可以使用散列值的模数。
1 - 在一般情况下,我不确定这个数字来自何处,或者是否有实证研究来支持它。我怀疑它来自(ASCII)字符串的哈希。但31
是素数......它是一个梅森素数(31
),这意味着如果硬件倍数很慢,可以使用移位和减法来计算。
2 - 我排除了你需要担心有人故意制造哈希函数碰撞以试图“破坏”某些东西的情况。
答案 1 :(得分:0)
您可以使用具有HashCodeBuilder
类的Apache Commons库。假设您的Rectangle
课程有width
和height
,您可以添加以下方法:
@Override
public int hashCode(){
return new HashCodeBuilder().append(width).append(height).append(children).toHashCode();
}
答案 2 :(得分:0)
您想要的(在您对该问题的评论中澄清)是不可能的。有N个可能的hashCodes,每个int一个,其中N约为42亿。假设矩形必须具有正尺寸,则存在((N * N)/ 4)个可能的矩形。你如何建议使它们适合N hashCodes?当N> 4,你有比hashCodes更多的矩形。