我正在寫C程序,這是設計爲快速。快速哈希函數爲IPv4/6地址
我想存儲數據流中IP地址的出現次數。例如,我將分析100MB二進制文件,其中包含大約2 000 000個IP地址(但也許程序也將用於x-GB文件)。
我的想法是使用哈希表,所以我需要這些散列函數:
20b_int indexToIPv4HashTable = hashIPv4(32b_int addr4);
20b_int indexToIPv6HashTable = hashIPv6(128b_int addr6);
我想是不是當這功能將有碰撞有時問題(我會解決這個使用單獨的鏈接)。
- 我應該使用哪些散列函數?
- 這個問題使用散列表是個好主意嗎?
小數學:
- 20b的索引= 1層048 576的元件(是否足夠?)
- 32B元素= 4B元素= 4MB表大小(是這樣的尺寸確定,當程序將在 當前計算機上運行)
注: IP地址可能指定了一個掩碼。例如:IPv4/24 - >現在只有2^24個不同的IPv4地址,而不是2^32。 當設置掩碼時,我應該使用不同的散列表大小嗎?
絕對優先級是速度。
addr [i]和addr [i + n]之間是否有任何相關性,其中n很小?當確定散列函數必須對比特進行加擾時,這可能是一個至關重要的因素。在I7中,在速度上很難擊敗crc32指令(或多項式乘法的組合),但它的整體性能很重要。 –