【发布时间】:2020-12-01 18:40:27
【问题描述】:
我的目标是将支持缓冲区协议的对象提供给 hashlib 的 sha2 生成器,以便在不同执行环境中从相同底层数据生成的 sha2 哈希是一致的,因此可以用于相等性测试。
我希望它适用于任意数据类型,而不必围绕bytes() 或bytearray() 编写一堆样板包装器,即一个我可以传递字符串(带编码)、数字和布尔值的函数。如果我能获得复杂类型(如字典或列表)的内存布局,则加分。
我正在查看struct,以及将数据加载到pandas DataFrame 中,然后使用 Apache Arrow 直接访问内存布局。
寻找有关完成此任务的最“pythonic”方式的指导。
【问题讨论】:
-
“我希望它适用于任意数据类型” - 不起作用。您将如何散列管道、数据库连接或其他不真正代表 数据 的类型?此外,即使是代表数据的东西,也没有通用的 API。
-
@user2357112supportsMonica 我很好地限制了保存数据并且是原语组合的类型。需要指出的是,没有通用的 API ——这就是我正在验证的,以确保答案不是“哦,请致电
mem_repr(x)” -
(在有人建议之前,不,用
pickle序列化对象不是答案。相同的对象可能会产生不相等的泡菜。例如,{0, 16}和{16, 0}将在当前产生不同的泡菜CPython。) -
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.给了我一些想法。 -
哦,嘿,这是实际使用带外数据功能的项目之一!请注意,这实际上使它离您的目标更远。创建可用作哈希输入的东西并不是 Ray 序列化的目标之一。
标签: python pandas memory hash apache-arrow