3

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

我想使用 CRC 散列函数将 IP 地址(如“128.0.0.5”)散列到范围 [0, H) 中。目前我正在考虑做

zlib.crc32('128.0.0.5')%H.

这个可以吗?有几个问题。你可以试着回答...

  • 它有什么不同吗?如果我散列 '128.0.0.5' 或其二进制 '0001110101010..' 无论是或没有 '.'

  • zlib.crc32 返回一个有符号整数。修改(%)是否否定。带有正 H 的总是给出一个 pos 否?

  • H 的 %-ing 会影响散列函数的好坏吗?(我的意思是使用可用的 xlib.crc32 为可用空间做的最好的事情)

谢谢!

4

3 回答 3

4

为什么要将 IP 地址散列成数字?它们已经具有原生整数表示。例如,使用netaddr

>>> import netaddr
>>> ip = netaddr.IPAddress('192.168.1.1')
>>> ip.value
3232235777
>>> netaddr.IPAddress(3232235777)
IPAddress('192.168.1.1')
于 2011-07-20T02:37:13.880 回答
1

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

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

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

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

于 2011-07-20T01:57:17.250 回答
1

它有什么不同吗?如果我散列 '128.0.0.5' 或其二进制 '0001110101010..' 无论是或没有 '.'

并不真地。

zlib.crc32 返回一个有符号整数。修改(%)是否否定。带有正 H 的总是给出一个 pos 否?

是的。

H 的 %-ing 会影响散列函数的好坏吗?(我的意思是使用可用的 xlib.crc32 为可用空间做的最好的事情)

您最好使用校验和的所有位来弥补它们缺乏“雪崩效应”。单个数字的变化,例如192.168.1.1,192.168.1.2等可能仅在校验和的第一位产生差异,并且由于%只关心最后一位,因此哈希会发生冲突。

于 2011-07-20T02:43:04.997 回答