[英]How can hashing Long ids to integer ids be safe?
我只是沒有比這更好的解決方案了。
簡單的例子:我吃飯。 每頓飯都有描述,但用不同的語言來描述。 這就是MealDescription
由主鍵(MealId, LanguageId)
。 到現在為止還挺好。
這里的指南告訴我,我必須實現equals()
和hashCode()
但是這樣做是安全的:
@Override
public int hashCode() {
return (int) mealId.hashCode() + languageId.hashCode();
}
如果mealId
和languageId
ID實際上是Long
類型,因為它們是ID,就必須像它們一樣?
我指的指南也一樣:
private String name;
private long id;
// ..
public int hashCode() {
return (int) name.hashCode() + id;
}
那么如何解決呢?
哈希原則上不如對象多樣化。 您可以將兩個或多個對象映射到同一哈希。 始終從hashCode()
返回0
甚至是合法的(盡管非常糟糕hashCode()
另一個示例,無論消息多長時間,MD5哈希都是128位。
切記: return 0
始終是hashCode()
的有效實現。 哈希碼不應該是唯一的,這種實現就可以了。
或多或少,您希望從hashCode
實現中獲得的只是弄亂數字,直到您可以根據輸入快速進行計算, int
,確定性,否則將變得混亂。 這是一個完美的實現。
如果您的mealId
/ languagId
是Long
,為什么使用它們的hashCode()
會引起問題? 這每天都會在許多Java代碼中發生。 哈希值通常總是短於它們源自的對象。 “希望”發生的事情是發生碰撞的風險很小,並且不會像添加時那樣通過添加兩個哈希來增大或減小該風險。
因此,TL; DR是的,這很安全。
干杯,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.