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

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

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

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

Ищете руководство относительно наиболее питонического способа сделать это.


person Alex Flanagan    schedule 01.12.2020    source источник
comment
Я бы хотел, чтобы это работало для произвольных типов данных - не будет работать. Как бы вы хэшировали конвейер, соединение с базой данных или другие типы, которые на самом деле не представляют данные? Кроме того, даже для вещей, которые представляют данные, для этого не существует общего API.   -  person user2357112 supports Monica    schedule 01.12.2020
comment
@ user2357112supportsMonica Я могу ограничиться типами, которые содержат данные и представляют собой комбинации примитивов. Принято во внимание, что для этого нет общего API - это то, что я проверяю, чтобы убедиться, что ответ не похож на что-то вроде, о, просто позвоните mem_repr(x)   -  person Alex Flanagan    schedule 01.12.2020
comment
(Прежде чем кто-то предложит это, нет, сериализация объектов с помощью pickle не является ответом. Равные объекты могут создавать неодинаковые рассола. Например, {0, 16} и {16, 0} будут создавать разные рассола на текущем CPython.)   -  person user2357112 supports Monica    schedule 01.12.2020
comment
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 & nested functions, dynamic classes) with the support of cloudpickle. Дал мне несколько идей.   -  person Alex Flanagan    schedule 01.12.2020
comment
О, привет, это один из проектов, использующих функцию внеполосных данных! Обратите внимание, что на самом деле это еще больше отдаляет вас от вашей цели. Создание чего-либо, пригодного для использования в качестве хеш-ввода, не является одной из целей сериализации Рэя.   -  person user2357112 supports Monica    schedule 01.12.2020
comment
Ааа, я как раз собирался сказать, что Plasma выглядит так, как будто делает то, что я хочу :)   -  person Alex Flanagan    schedule 01.12.2020


Ответы (1)


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

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

person Alex Flanagan    schedule 02.12.2020