2017-03-16 86 views
-1

由于已知的事实是Java产生大约40亿个独特的哈希码。生成较大的HashCode JAVA

我使用一些字符串的Hashcode方法(例FNAME LNAME + + +出生日期DATE)成为我的@PrePersist数据库

的主键我Hashcode方法让我在生成的哈希码新用户设置。 (这必须是唯一的)。

现在我用完了代码。对我来说可能的替代方案是使用SHA-2,MD5等。

如何增加散列码的大小&但是避免了大的冲突。

+1

难道你不能只是定义一个方法类似'hashCode()'''长''或'BigInteger'返回类型吗? – Logan

+1

不要将散列码用作数据库中的主键。散列码不唯一,不适合用作唯一标识符。使用不同的散列算法将无济于事,因为这些散列原则上也不是唯一的(尽管在实践中散列冲突应该很少见)。使用散列码作为主键是系统设计中的一个根本性错误。 – Jesper

+0

当您有两个用户具有相同的姓名和出生日期并在同一天注册时会发生什么情况?我知道这种情况可能很少,但是当它发生时会发生什么? – dstarh

回答

2

如果你的目标是为数据库创建一个唯一的标识符,我会建议使用UUID

UUID Version 3,因为它使用命名空间,将适合您的情况。

有些数据库有UUID的原生支持,例如PostgreSQL

+0

在我的情况下,哈希码是字段的组合,使得该元组成为唯一的,然后成为我的主键。对我来说,它的行为就像校验和+唯一性和主键。 – Ashish

+2

@Ashish,这是一个可怕的想法。散列码绝不能被认为是唯一的。 _停止使用散列码作为主键._ –

1

我想你混淆使用INT是Object.hashCode(),它可以覆盖并返回一个int和使用安全散列函数。这是两件事。 Object.hashCode不用于返回唯一整数(返回1是有效的实现)。因此,使用String.hashCode()作为对象标识不是一个好主意,因为它可以并且会碰撞。它旨在用于例如哈希表;这意味着它针对性能进行了优化,而不是为了避免碰撞。

如果您想要某种内容散列,您的确可以使用sha1,sha2,sha3或md5。如果没有,使用SecureRandom或UUID随机生成一些东西。所有这些都给你一次碰撞的可能性非常低(当然不是完全0)。