2017-03-16 61 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)。