我如何散列矩形?

时间:2013-08-31 00:07:23

标签: java hash

我有一个Rectangle类。它有长度,宽度和面积(所有整数)。我想散列它,使得具有相同长度和宽度的每个矩形都散列到相同的值。有什么方法可以做到这一点?

编辑:我理解它是一个广泛的问题。这就是为什么我要求“a”方式来做到这一点。不是最好的方式。

3 个答案:

答案 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课程有widthheight,您可以添加以下方法:

@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更多的矩形。