關於d-left hashing,上一篇文章已經介紹過了,這裡不再多講。前面提到過,使用d-left hashing是為瞭解決雜湊表的Server Load Balancer問題。為了瞭解d-left hashing如何解決這個問題,我們先來看沒有d-left hashing的情況。同一個hash value高位用作地址低位用作fingerprint,這就意味著同一個地址對應著多個fingerprint。一個地址對應一個bucket,因此一個bucket需要儲存多個fingerprint。由於單個雜湊函數的hash value分布不均,各個bucket的負載也不均衡。如果每個bucket能儲存的fingerprint數量固定,為了不溢出必須按最壞的情況來分配bucket的容量,這就造成了不小的浪費。
使用d-left hashing之後,fingerprint的分布相對比較均衡,因此大大減少了空間的浪費。原來即使分配很大的雜湊表,由於按最壞情況分配bucket容量,仍然很難縮小bucket的容量,並且雜湊表中大量空間閑置。而使用d-left hashing可以讓儲存的資訊分布均勻,更加緊湊,從而用更小的空間儲存同樣多的資訊。在Perfect Hashing VS. Bloom Filter一文中提到過,d-left counting bloom filter可以比counting bloom filter節省至少一倍的空間,就是因為counting bloom filter負載不均衡,很多空間都被浪費掉了。
從另一個角度考慮,d-left hashing扮演的其實是一個perfect hash function的角色。原來負載不均衡的情況下,碰撞的情況很嚴重,使用d-left hashing後大大減少了碰撞。當然,它不能完全消除碰撞,因此它只是用一種開銷較小的方式類比了perfect hash function,可以稱它為almost-perfect hash function。