Хобрук: Ваш путь к мастерству в программировании

Есть ли простой способ создать хэш списка словарей?

У меня есть список, содержащий словари, которые, в свою очередь, могут содержать другие списки и/или словари, например

a =  [{3:4},{1:2}, {5:[5,6,7,7]} ]

Я хотел бы создать хеш-сумму (или что-то эквивалентное) этого объекта, чтобы сравнить его с другим хешем, который отличается, когда содержимое списка отличается.

Мне нужно это, чтобы делать запросы по сети. Вместо того, чтобы все время вытягивать, возможно, очень большие списки по сети, я просто получаю хеш-сумму, и только когда эта сумма отличается от предыдущей хеш-суммы, я получаю весь список по сети.

Есть ли простой способ сделать это?

16.03.2013

  • наверное очень большие - они большие? Насколько большой? 16.03.2013
  • Думаю, быстрый и грязный путь будет hashlib.sha256(pickle.dumps(a)).digest(). 16.03.2013
  • Если все хэши должны быть уникальными, вы в конечном итоге получите огромные хэши и не сэкономите трафик. Вы должны выбрать разумный размер хэша и иметь дело с возможностью возникновения хеш-коллизий. 16.03.2013
  • hashlib.sha256(pickle.dumps(a)).digest() будет зависеть от порядка итерации по словарю 16.03.2013
  • @all: спасибо за вклад, я думаю, в моем случае может подойти просто опрос исходного объекта, поскольку размеры объектов в любом случае не мегабайты 16.03.2013

Ответы:


1

Вы можете использовать рассол

hashlib.md5(pickle.dumps(a[0])).hexdigest()

str не всегда дает ожидаемый результат

16.03.2013

2

Как насчет того, чтобы сделать что-то вроде:

# imports
import copy

def make_hash(x):
     # Check if arg is a list, tuple or set
     if isinstance(x, (set, tuple, list)):
         return tuple([make_hash(y) for y in x])

     # Check if arg is not a dict
     elif not isinstance(x, dict):
         return hash(x)

     new = copy.deepcopy(x)
     for k,v in new.items():
         new[k] = make_hash(v)
     return hash(tuple(frozenset(new.items())))

и тогда вы можете просто сделать make_hash([{...},{...}])

16.03.2013
Новые материалы

Аргументы прогрессивного улучшения почти всегда упускают суть
В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

Введение в Джанго Фреймворк
Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

стройный-i18следующий
Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..

Обзор 20 основных и современных методов работы с массивами в JavaScript
Вы знаете их всех? В этом коротком посте я покажу сводку методов, доступных в JavaScript для работы с массивами. Я надеюсь, что вы найдете это полезным! В конце поста вы найдете ссылку на..

Да, но я чувствую необходимость указать, что это или не единственные два.
Да, но я чувствую необходимость указать, что это или не единственные два. Обучение с подкреплением (в качестве примера) также является важным.