将IP地址散列为[0,H)中的数字

时间:2011-07-20 01:36:40

标签: python ip-address hash zlib crc32

我正在使用Python-2.6。我对哈希函数知之甚少。

我想使用CRC哈希函数将类似'128.0.0.5'的IP地址哈希到[0,H]范围内。目前我正在考虑做

zlib.crc32('128.0.0.5')%H.

这可以吗?有一些问题。你可以尝试回答......

  • 是否有任何差异。如果我散列'128.0.0.5'或其二进制'0001110101010 ..'无论是否有'。的

  • zlib.crc32返回有符号整数。 modding(%)是否为neg。积极的H总是给一个pos no?

  • H的%-ing是否会影响哈希函数的效果? (我的意思是,我可以利用可用的xlib.crc32为可用空间做得最好)

谢谢!

3 个答案:

答案 0 :(得分:4)

为什么要将IP地址哈希到一个数字?它们已经具有原生整数表示。例如,使用netaddr

>>> import netaddr
>>> ip = netaddr.IPAddress('192.168.1.1')
>>> ip.value
3232235777
>>> netaddr.IPAddress(3232235777)
IPAddress('192.168.1.1')

答案 1 :(得分:1)

ad 1)它会产生不同的结果,但不会影响哈希的质量。

ad 2)它总是会产生正数或零。

ad 3)当您限制可能的桶数时,它确实会影响散列的质量。

一般来说:你的H有多大?请记住,IPv4地址只不过是32位值。 192.168.0.1只是一个更易读的字节表示。因此,如果您的H大于4294967295,则不需要散列。

答案 2 :(得分:1)

  

是否会产生任何差异。如果我散列'128.0.0.5'或其二进制'0001110101010 ..'无论是否有'。's

不是。

  

zlib.crc32返回有符号整数。 modding(%)是否为neg。积极的H总是给一个pos no?

  

H的%-ing是否影响哈希函数的好坏? (我的意思是我可以利用可用的xlib.crc32对可用空间做的最好)

你最好使用校验和的所有位来弥补它们缺乏“雪崩效应”。诸如192.168.1.1192.168.1.2之类的单位数变化可能仅在校验和的前几位产生差异,并且由于%仅关注最后一位,因此哈希将发生冲突。 / p>