Преобразование произвольных объектов в байты в Python3

#python #pandas #memory #hash #apache-arrow

#python #панды #память #хэш #apache-стрелка

Вопрос:

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

Я бы хотел, чтобы это работало для произвольных типов данных без необходимости писать кучу шаблонных оберток bytes() или bytearray() , то есть, одну функцию, в которую я могу передавать строки (с кодировкой), цифры и bools. Дополнительные баллы, если я смогу получить макет памяти для сложного типа, такого как dict или list.

Я смотрю struct , а также делаю что-то вроде загрузки данных в pandas DataFrame, а затем использую Apache Arrow для прямого доступа к макету памяти.

Ищу рекомендации относительно наиболее «питонического» способа достижения этой цели.

Комментарии:

1. «Я бы хотел, чтобы это работало для произвольных типов данных» — не сработает. Как бы вы хэшировали канал, или соединение с базой данных, или другие типы, которые на самом деле не представляют данные ? Кроме того, даже для материалов, которые представляют данные, для этого нет общего API.

2. @user2357112supportsMonica Я в порядке, ограничивая типы, которые содержат данные и представляют собой комбинации примитивов. Учтено, что для этого нет общего API-интерфейса — это то, что я проверяю, чтобы убедиться, что ответ не будет чем-то вроде: «о, просто позвони mem_repr(x) »

3. (Прежде чем кто-то предложит это, нет, сериализация объектов с pickle помощью не является ответом. Равные объекты могут привести к неравным пикулям. Например, {0, 16} и {16, 0} будет создавать разные варианты для текущего CPython.)

4. docs.ray.io/en/master/serialization.html , особенно эта часть: Ray has decided to use a customed Pickle protocol version 5 backport to replace the original PyArrow serializer. This gets rid of several previous limitations (e.g. cannot serialize recursive objects). Ray is currently compatible with Pickle protocol version 5, while Ray supports serialization of a wilder range of objects (e.g. lambda amp; nested functions, dynamic classes) with the support of cloudpickle. Дала мне несколько идей.

5. О, эй, это один из проектов, фактически использующих функцию внеполосных данных! Обратите внимание, что на самом деле это еще дальше от вашей цели. Создание чего-либо, пригодного для использования в качестве хэш-ввода, не является одной из целей сериализации Рэя.

Ответ №1:

hashlib.sha256(bytes(struct.pack('!f', 12.3))).hexdigest())

Повторите для всех собственных типов.