xenon
@xenon
Too drunk to fsck

Как получить какой-нибудь хеш от значения переменной (dict)?

В скрипте проверяются данные (конкретно - о сетевых подключениях) и хочется найти те из них, которые уже слишком долго живут. О каждом сетевом соединении мы можем получить его данные в формате dict(). Вот хочется через 10 минут убедиться, что проверяемое соединение мы уже видели раньше (10 минут назад), сравнив его хеш.

>>> d1={"a":1}
>>> id(d1)
281473806329984
>>> d2={"a":1}
>>> id(d2)
281473806330112
>>> d1==d2
True


Вот по примеру видно, что сравнивать id нельзя, одинаковые dict() - это все-таки разные объекты. Сравнивать через == можно, но как-то не очень красиво, хранить целый dict. Нельзя ли сейчас как-то посчитать что-то от d1, через 10 минут посчитать что-то от d2, и чтобы оно сошлось?

Ну и есть ли для этого стандартный путь, а то велосипед изобрету.
  • Вопрос задан
  • 128 просмотров
Решения вопроса 1
metalexs
@metalexs
Для того чтобы получить хеш-значение от словаря (dict), вы можете использовать hashlib из стандартной библиотеки Python. Один из популярных и безопасных алгоритмов хеширования — это SHA-256.

Сначала, нужно сериализовать словарь в строковое представление (например, в формат JSON), а затем получить хеш этой строки.
import hashlib
import json

def dict_hash(d):
    serialized_data = json.dumps(d, sort_keys=True).encode()
    return hashlib.sha256(serialized_data).hexdigest()

d1 = {"a": 1}
d2 = {"a": 1}

hash1 = dict_hash(d1)
hash2 = dict_hash(d2)

print(hash1 == hash2)  # Вернет True, потому что содержимое словарей идентично

Этот метод позволяет получить уникальное строковое представление для каждого уникального словаря. По сути, вы можете сохранить это значение хеша и проверять его через 10 минут. Если хеши совпадают, то содержимое словарей также совпадает.

Обратите внимание, что в этом методе используется sort_keys=True при сериализации в JSON. Это делается для гарантии того, что порядок ключей в словаре не влияет на результат хеширования. Если порядок ключей может изменяться, но при этом словари остаются идентичными, то без сортировки ключей у вас могут получаться разные хеш-значения для идентичных словарей.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Everything_is_bad
стандартный путь - хранить время, хочешь изменить стандатый метод, унаследуй, да переопредели
Ответ написан
Vindicar
@Vindicar
RTFM!
Очевидно, надо в каждом словаре найти значение, которое уникально идентифицирует соединение.
Я бы сказал, это пара IP:порт удаленного узла (с которым установлено соединение).
Не уверен, будет ли эта информация в словаре, так как ты не озаботился привести пример, и как это будет работать с UDP (где формальных соединений нет), но попытаться можно.
Ответ написан
Ваш ответ на вопрос

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

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