[英]Perfect hashing function and benefits
考慮這個課程:
public final class MyDate {
private int year, month, day;
public MyDate(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
//Some stuff
@Override
public int hashCode() {
return ((year << 4) | month) << 5 | day;
}
}
這是一個完美的散列函數,因為在內存中我們有:
所以在紅色中, 5 bits
存儲當天(1到31),黃色4 bits
存儲月份(1到12),其他存儲年份(1到16777215)。
完美的hashFunction
什么好處? AFAIK,它可以保證HashSet
中的O(1)
中的添加/刪除/包含但我可以獲得其他好處嗎?
我看到很多哈希函數都使用素數,構造一個哈希函數的最佳方式是什么(我想創建一個完美的哈希函數是非常/罕見的)?
關於素數 - > 在這里回答
完美的哈希函數可確保您不會發生沖突。 但是,為了能夠使用一個,您必須確切地知道需要進行哈希處理的鍵值集合,這通常不是這種情況。
其他不太完美,但仍然很好的散列函數(以及碰撞解決機制)沒有這個要求,並且計算速度非常快,所以它們通常更合適。
根據Juampi,它很快。 多快? 大約為O(1)。 Redis是通過哈希表在內存中進行常量時間查找的一個很好的例子。
如果你沒有在哈希結果上只有一個元素的桶,那么你需要使用equals來比較每個項目,這樣你就可以查找O(1加z),其中z是桶大小。
但是非常慢的哈希函數肯定不是一個好主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.