【发布时间】:2014-03-30 18:33:50
【问题描述】:
我正在用 C 编写程序,它设计得很快。
我想存储 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 指令(或多项式乘法的组合),但重要的是整体性能。
标签: c hash hashtable ip-address hash-function