0

众所周知,Java 会生成大约 40 亿个唯一哈希码。

我正在使用一些字符串的哈希码(例如 Fname + Lname + DOB + DATE),它成为我的数据库的主键

在 @PrePersist 中,我使用 Hashcode 设置它,这有助于我为新用户生成 Hashcode。(必须是唯一的)。

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

我怎样才能增加哈希码的大小并避免大的冲突。

4

2 回答 2

2

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

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

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

于 2017-03-16T15:34:17.543 回答
1

我认为您对使用 int Object.hashCode() 感到困惑,您可以覆盖它并返回一个 int 并使用安全哈希函数。这是两件事。Object.hashCode 不打算返回唯一的整数(返回 1 是有效的实现)。因此,将 String.hashCode() 用于对象标识并不是一个好主意,因为它可以并且将会发生冲突。它旨在与例如 HashTables 一起使用;这意味着它针对性能而不是避免碰撞进行了优化。

如果您想要某种内容哈希,您确实可以使用 sha1、sha2、sha3 或 md5。如果没有,请使用 SecureRandom 或 UUID 生成随机的东西。所有这些发生碰撞的概率都非常低(当然不完全是 0)。

于 2017-03-16T15:41:31.233 回答