簡體   English   中英

如何將Long ID散列為整數ID是安全的?

[英]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();
}

如果mealIdlanguageId 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 / languagIdLong ,為什么使用它們的hashCode()會引起問題? 這每天都會在許多Java代碼中發生。 哈希值通常總是短於它們源自的對象。 “希望”發生的事情是發生碰撞的風險很小,並且不會像添加時那樣通過添加兩個哈希來增大或減小該風險。

因此,TL; DR是的,這很安全。

干杯,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM