簡體   English   中英

在數據庫中對IPv4和IPv6地址進行排序

[英]Sorting IPv4 and IPv6 address in a Database

我有一個用於存儲IP地址的字段,並且我正在使用以下代碼將IPv4地址轉換為整數,因此可以將地址的可排序版本保存在單獨的bigint字段中,以實現更自然的排序(基於 ):

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。 我想支持將地址保留為零的各種方法。

更新 :我正在使用Django 1.5

我最終使用以下代碼將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

按照kroolik的建議,使用DecimalField有效

我相信我會在。上分割IPv4地址,並按列表排序。 同樣,對於IPv6,我會嘗試在:上拆分,並將它們也作為列表進行排序。

並且將其包裝為一個類可能是個好主意,以防萬一行為需要改變。 這樣,如果確實發生更改,則更改不會分散在您的代碼中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM