@raiboon

Как искать cidr по ip?

Есть файлик, ключ-значение, где ключом служит cidr. К нам приходит ip, нужно по этому ip найти значение, желательно за O(1), и держать всё в памяти приложения. Популярные слова и не могу нагуглить модуль или структуру данных для этого.
Есть чего для решения задачи? Либо питоновский, ли на го (давно хотел написать расширение для питона на го)
  • Вопрос задан
  • 2604 просмотра
Пригласить эксперта
Ответы на вопрос 4
@throughtheether
human after all
Популярные слова и не могу нагуглить модуль или структуру данных для этого.
На мой взгляд, вам может помочь patricia trie/radix tree. Вот какая-то релевантная имплементация на golang. Вот python-версия.
Ответ написан
Комментировать
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
31 мэп IP -> значение, по одному для каждой возможной длины маски. Начинать поиск в том, что соответствует самой длинной маске. O(1) если мэпы отработают за O(1).
Ответ написан
Комментировать
@SilentFl
можно сделать в рамках Go на map'ах (да, jcmvbkbc, они за O(1), у них внутри hash-table), можно сделать на key-value storage (memcache, redis, groupcache, mongo и т.п.)
Ответ написан
@egorsmkv
Решение с использованием библиотеки iptools:
from iptools import IpRange


def search_cidr(ip, cidrs):
    for cidr in cidrs:
        if ip in IpRange(cidr):
            return cidr

    return False

if __name__ == '__main__':
    cidrs = ['10.0.0.0/30', '10.0.0.5/32']
    your_ip = '10.0.0.2'

    find = search_cidr(your_ip, cidrs)

    if find:
        print('Found:', find)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы