在Python3中将任意对象转换为字节

在Python3中将任意对象转换为字节,python,pandas,memory,hash,apache-arrow,Python,Pandas,Memory,Hash,Apache Arrow,我的目标是将支持缓冲区协议的对象馈送到hashlib的sha2生成器中,以便在不同的执行环境中从相同的底层数据生成的sha2哈希是一致的,因此可以用于相等性测试 我希望它能够适用于任意数据类型,而不必在bytes()或bytearray()周围编写一堆样板文件包装,也就是说,一个可以传递字符串(带编码)、数字和布尔值的函数。如果我能得到像dict或list这样的复杂类型的内存布局,那就多加一点 我正在研究struct,以及将数据加载到pandasDataFrame中,然后使用apachearro

我的目标是将支持缓冲区协议的对象馈送到hashlib的sha2生成器中,以便在不同的执行环境中从相同的底层数据生成的sha2哈希是一致的,因此可以用于相等性测试


我希望它能够适用于任意数据类型,而不必在
bytes()
bytearray()
周围编写一堆样板文件包装,也就是说,一个可以传递字符串(带编码)、数字和布尔值的函数。如果我能得到像dict或list这样的复杂类型的内存布局,那就多加一点

我正在研究
struct
,以及将数据加载到
pandas
DataFrame中,然后使用apachearrow直接访问内存布局

正在寻找有关实现此目标的最“pythonic”方法的指导。

hashlib.sha256(字节(struct.pack(“!f',12.3))).hexdigest())


对所有本机类型重复此操作。

“我希望此操作适用于任意数据类型”-不起作用。如何散列管道、数据库连接或其他不真正表示数据的类型?此外,即使对于确实表示数据的内容,也没有通用的API。@user2357112supportsMonica我可以将其限制为包含数据的类型以及原语的组合。需要指出的是,没有通用的API来解决这个问题——这就是我正在验证的,以确保答案不是“哦,只要调用
mem_repr(x)
”(在有人建议之前,不,用
pickle
序列化对象不是答案。相等的对象可能会产生不相等的pickle。例如,
{0,16}
{16,0}
将在当前CPython上生成不同的Pickle。),特别是这一部分:
Ray已决定使用自定义的Pickle协议版本5 backport来替换原始PyArrow序列化程序。这摆脱了以前的一些限制(例如,无法序列化递归对象).Ray当前与Pickle协议版本5兼容,而Ray支持更广泛对象的序列化(例如lambda和嵌套函数、动态类)在cloudpickle的支持下。
给了我一些想法。哦,嘿,这是实际使用带外数据功能的项目之一!但请注意,这实际上离您的目标更远。创建可用作哈希输入的内容不是Ray序列化的目标之一。