2012-09-01 32 views
0

我有一张表,其PK由两个简短的变量(15和5)和一个日期时间字段组成。生成Hibernate复合键的bulletprooh hashCode

我对创建hashCode的想法是将日期时间合成为类似于yyyyMMddHHmmss的东西,然后使用某个分隔符(例如_)将其与另外两个字段连接起来,然后请求该字符串上的哈希码。

想知道是否有更优雅的方法。

谢谢

+1

这个问题与hibernate无关。只要按照最佳做法编写散列码(已被多次询问/回答)。实质上,为了计算具有多个字段的对象的哈希码,计算每个单独字段的哈希码并以某种方式组合它们(添加它们,对它们进行异或等)。 – JimN

+0

我担心的是增加两个数字会产生相同的结果,因为增加另外两个完全不同的数字。例如5 + 6 = 7 + 4.这就是为什么我犹豫使用这种方法 – amphibient

+1

两个对象产生相同的哈希码是合法的;这被称为哈希碰撞,并且在大多数情况下无法避免。依赖于散列码的数据结构必须准备用于处理散列碰撞,使用诸如桶链接或线性探测之类的技术。 – JimN

回答

0

所有这一切都取决于你的意思是“防弹”。如果你的意思是它可以用作Java对象的hashCode,那么它应该没问题。不Hibernate返回一个日期时间作为一个java Date?如果是这样,只需在Date上使用hashCode即可。你可以用另一个hashCode来代替连接和散列函数(或者添加...),它可能会更快一些。

如果通过“防弹”你需要一个密码安全的散列,那么你需要做更多。

+0

我的意思是“防弹”是保证不会有欺骗或误报。我怀疑每个字段的哈希码是否有简单的加法,因为可能有两个完全不同属性的元组,它们的添加哈希码最终是相同的。如示例5 + 6 = 7 + 4所示。 – amphibient

+2

未设置哈希码以便“不会有重复” - 您大概会采取长度为N字节的东西,并通过算法生成一些东西M字节长,其中N大于M.如果可以用M字节以编码的方式表示所有可能的N值,给你更多的权力,但是通常给定的散列值可能代表多于一个原始字符串。 – arcy

+0

让我这样说吧,这里是Hibernate为JimN发挥作用的地方:我不确定Hibernate会在Hibernate身份验证中扮演什么样的角色,但我想要做的就是确保XYZ永远不会即使两个完全不同的元组的哈希码可能相同,也会与ABC混淆。我希望的是,重写的等号方法是可以确保的。我对吗?谢谢 – amphibient