在数据库中排序IPv4和IPv6地址

2024-06-09 10:50:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个用于存储IP地址的字段,我使用此代码将IPv4地址转换为整数,这样我可以将地址的可排序版本保存在单独的bigint字段中,以实现更自然的排序(基于this):

octets = ip.split('.')
return (int(octets[0]) * 256**3) + (int(octets[1]) * 256**2) + (int(octets[2]) * 256) + (int(octets[3]))

对于bigint字段来说,IPv6地址太大了,我该怎么做呢?在

有没有一种简单的方法来实现IPv6的整数转换呢?Python3似乎提供了“ipaddress”模块,但我使用的是2.7。我想支持各种各样的方法,把零放在地址之外。在

更新:我使用的是django1.5


Tags: 方法代码版本ipreturn排序地址整数
2条回答

我想我应该把IPv4地址分开,然后按列表排序。 与IPv6类似,我尝试在:,并将它们作为一个列表进行排序。在

把它打包成一个类可能是个好主意,以防某一天行为需要改变。这样,如果它确实发生了变化,那么更改就不会分散在代码中。在

最后我用这段代码把IP转换成整数:

import struct, socket

try:
    return struct.unpack('!I', socket.inet_pton(socket.AF_INET, ip))[0]
except socket.error:
    try:
        hi, lo = struct.unpack('!QQ', socket.inet_pton(socket.AF_INET6, ip))
        return (hi << 64) | lo
    except socket.error:
        return 0

按照克罗利克的建议,使用了分米尔菲尔德

相关问题 更多 >