【问题标题】:Hashing an IP address to a number in [0, H)将 IP 地址散列到 [0, H) 中的数字
【发布时间】:2011-10-09 00:32:09
【问题描述】:

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

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

zlib.crc32('128.0.0.5')%H.

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

  • 它会产生任何差异吗?如果我散列 '128.0.0.5' 或其二进制 '0001110101010..' 无论是或没有 '.'s

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

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

谢谢!

【问题讨论】:

  • H 有多大,你想如何处理碰撞?
  • IP 地址已经是一个无符号的 32 位整数。你到底想用这个实现什么?
  • 我正在散列,因为我不想使用 32 位来存储 IP 地址,而只是 log(H, 2),我将对散列做更多的事情值,我希望它们是随机的。 H 将使用少于 32 位,大约 8 或 10 位。

标签: python ip-address hash zlib crc32


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢,我的 H 会小很多,prob。大约 2**8 左右。
【解决方案2】:

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

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

【讨论】:

  • +1 表示根本不使用哈希。也会因为使用 netaddr 而给 +1
  • 我正在散列,因为我不想使用 32 位来存储 IP 地址,而只是 log(H, 2),我将对散列做更多的事情值,我希望它们是随机的。不过我不知道netaddr。看起来它将 IP 地址从“base 256”更改为 base 10,整洁!
  • 如果您想将 32 位数字散列到较小的大小,您将失去分辨率,正如其他人所建议的那样。 netaddr` 模块没有做任何技巧,只是提供了一个 Python 接口。 IPv4 地址的整个范围 (0.0.0.0-255.255.255.255) 每个都代表一个从 0-4294967295 (232) 的无符号 32 位整数。 IPv6 也是如此,只是每个整数都是 128 位 (2128)。
【解决方案3】:

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

不是真的。

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

是的。

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

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

【讨论】:

    猜你喜欢
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 2012-05-10
    • 1970-01-01
    • 2017-07-01
    • 2019-08-25
    • 2011-10-06
    相关资源
    最近更新 更多