我正在使用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为可用空间做得最好)
谢谢!
答案 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.1
,192.168.1.2
之类的单位数变化可能仅在校验和的前几位产生差异,并且由于%
仅关注最后一位,因此哈希将发生冲突。 / p>