JSON序列化自定义非可序列化对象的常规方法是子类化json.JSONEncoder,然后将自定义编码器传递给转储.
它通常看起来像这样:
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, foo):
return obj.to_json()
return json.JSONEncoder.default(self, obj)
print json.dumps(obj, cls = CustomEncoder)
Run Code Online (Sandbox Code Playgroud)
我正在尝试做的是使用默认编码器进行序列化.我环顾四周但找不到任何东西.我的想法是编码器会看到一些字段来确定json编码.类似的东西__str__.也许是一个__json__领域.在python中有这样的东西吗?
我想制作一个模块的类,我正在使用JSON序列化给使用该软件包的每个人,而不必担心实现他们自己的[普通]自定义编码器.
我一直在使用pickle.dumps以便为任意Python对象创建哈希,但是,我发现dict/set命令不是规范化的,因此结果是不可靠的.
在SO和其他地方有几个 相关的 问题,但我似乎找不到使用相同基础进行相等(/ 结果)的哈希算法.我理解滚动自己的基本要求,但显然我更喜欢使用经过测试的东西.__getstate____dict__
这样的图书馆存在吗?我想我实际要求的是一个确定性地序列化对象的库(使用__getstate__和__dict__),这样我就可以对输出进行散列.
编辑
为了澄清,我正在寻找与Python hash(或__hash__)返回的值不同的东西.我想要的本质上是任意对象的校验和,可能是也可能不是.该值应根据对象的状态而变化.(我正在使用"状态"来指代由其重新调整的字典,__getstate__或者,如果不存在,则指对象的__dict__.)
python的hash函数可移植吗?
我所说的“可移植”是指,它会在Python版本、平台和实现中返回相同的结果(对于相同的数据)吗?
如果没有,是否有任何替代方案可以提供此类功能(同时仍然能够对常见数据结构进行哈希处理)?
Python 3 的默认散列函数不是确定性的(hash(None) 因运行而异),甚至没有尽最大努力以高概率生成唯一 id(hash(-1)==hash( -2) 是真的)。
是否有其他一些散列函数可以很好地作为校验和(即两个数据结构散列到相同值的概率可以忽略不计,并且每次运行 python 都返回相同的结果),并且支持所有 python 的内置数据类型,包括无?
理想情况下,它将在标准库中。我可以腌制对象或获取字符串表示,但这似乎不必要,并且浮点数的字符串表示可能是非常糟糕的校验和。
我在标准库中找到了加密哈希 (md5,sha256),但它们只对字节串进行操作。
Haskell 似乎在他们的标准库中得到了这个 ~ 几乎是正确的......但是“Nothing::Maybe Int”和 0 都散列到 0,所以它也不完美。
我在 python 中有一个字典,其中包含 unicode 值。我想计算这本字典的 md5 总和。我尝试使用这个问题的答案:Computing an md5 hash of a data structure
import hashlib
import bencode
data = {'unicode_text': '????'}
data_md5 = hashlib.md5(bencode.bencode(data)).hexdigest()
print data_md5
Run Code Online (Sandbox Code Playgroud)
但问题是bencode返回此错误:
KeyError: <type 'unicode'>
Run Code Online (Sandbox Code Playgroud)