簡體   English   中英

完美的散列功能和優點

[英]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.

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