2015-05-13 16 views
0

我只是不能想出比這更好的解決方案。如何哈希長整型ID是安全的?

簡單的例子:我吃飯。每餐都有描述,但是有不同的語言。這就是爲什麼MealDescription由主鍵(MealId, LanguageId)組成。到現在爲止還挺好。

This guide這裏告訴我,我必須實現equals()hashCode()但它是安全的做法是這樣的:

@Override 
public int hashCode() { 
    return (int) mealId.hashCode() + languageId.hashCode(); 
} 

如果mealIdlanguageIdLong類型其實很喜歡他們必須是因爲它們是IDS?

我指的是該指南不相同:

​​

那麼請問該怎麼工作呢?

+1

爲什麼它會不安全? –

+0

http://stackoverflow.com/questions/4045063/how-should-i-map-long-to-int-in-hashcode – copeg

+0

有很多散列衝突的唯一的大事將是對性能的影響,而不是得到O(1)的平均情況,你會得到O(n) - 最壞的情況。 – guilhebl

回答

2

散列,原則上,比對象更少多樣化。您可以將兩個或多個對象映射到相同的散列。它總是返回0hashCode()

另一個例子,MD5哈希是128位,無論消息多長時間,它都是合法的(儘管非常糟糕)。

0

如果您的mealId/languagIdLong的爲什麼它會是一個問題,使用他們的hashCode() s?這種情況每天都會發生在很多Java代碼中。哈希大多數情況下總是比它們源自的對象短。 「希望」的事情是碰撞的風險很小,並且像你一樣增加兩個哈希,風險不會變大或變小。

因此,TL; DR,是的,它是安全的。

乾杯,

2

永遠記住:return 0總是有效實施hashCode()。哈希代碼不是假設是唯一的,並且此實現很好。

或多或少你希望從hashCode實施,什麼只是用數字瞎搞,直到你得到的東西快速地計算,int形,確定性的基礎上輸入的條件,則儘可能凌亂。這是一個非常好的實現。