这是一个面试问题。我想过像multiway-hashing这样的解决方案,却找不到优雅的东西。请提出一些好的方法。
问题: 您有1000万个IP地址。 (IPv4 4字节地址)。为这些IP地址创建一个哈希函数。
提示:使用IP本身作为密钥是一个坏主意,因为会浪费很多空间
答案 0 :(得分:5)
有趣的是,这样一个有趣的问题没有任何有趣的答案(对于重言式抱歉)。
如果你认为这是一个理论问题,那么这个链接就是你所需要的(甚至有一个superfast
哈希函数为你编写并准备好了):
http://www.kfki.hu/~kadlec/sw/netfilter/ct3/
实际问题可能有所不同。如果您的哈希表大小合理,则无论如何都必须处理冲突(使用链接列表)。那么问问自己最终会发生什么用例?如果您的代码将在某个隐蔽的生态系统中运行,并且IP地址为a-b-c-d
,则c
和d
是最易变的数字,而d
则不会为空(假设您不处理网络),那么64K桶的哈希表和作为哈希的cd
可能会令人满意吗?
另一个用例 - TCP连接跟踪,其中客户端使用由内核随机分配的短暂端口(它不是散列的理想选择吗?)。问题是有限的范围:类似于32768-61000,它使最低有效字节比最高有效字节更随机。因此,您可以将最重要的字节与IP地址中最易变的字节进行异或,该字节可以是zerro(c
),并将其用作64K表中的哈希值。
答案 1 :(得分:0)
因为您的输入是随机的&表的大小小于地址空间你设计的任何哈希函数都会有自己的病态数据集,这会使你的哈希函数看起来很糟糕。我认为面试官想知道你对用作标准的现有哈希函数的了解。
以下是几个这样的哈希函数:
MD5
SHA-1,SHA-2
为什么这些函数比其他散列函数更有效,因为如果不使用强力算法,很难找到它们的语法数据集。所以如果你有比这些更好的东西,而不是告诉你的面试官(你可以获得专利并在谷歌找工作)。
对于Hashing ip地址,在其上使用MD5或SHA并截断到表的大小,您就完成了。
注意: - 表的大小必须为素数,以防止错误哈希。
答案 2 :(得分:0)
我之前也有同样的问题。
要解决此问题,您应该划分数据。 我们知道ip地址是结果。
然后,创建一个这样的地图。
然后,要获取IP的地址,只需从map获取值;
注意:所有的数据都在数据库中,我不认为它花费了大量的空间,要获得1s的地址,你应该花费几个空间来优化速度