python – 确定性密钥序列化
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 确定性密钥序列化,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1962字,纯文字阅读大概需要3分钟。
内容图文
![python – 确定性密钥序列化](/upload/InfoBanner/zyjiaocheng/812/265750490a5d47afbccbfc55e0c8cd5c.jpg)
我正在写一个持久化到磁盘的映射类.我目前只允许使用str键但是如果我可以使用更多类型会很好:希望可以使用任何可以清除的东西(即与内置字典相同的要求),但更合理的是我接受字符串,unicode,int和这些类型的元组.
为此,我想得出一个确定性的序列化方案.
选项1 – 腌制钥匙
我的第一个想法是使用pickle(或cPickle)模块来序列化密钥,但我注意到pickle和cPickle的输出彼此不匹配:
>>> import pickle
>>> import cPickle
>>> def dumps(x):
... print repr(pickle.dumps(x))
... print repr(cPickle.dumps(x))
...
>>> dumps(1)
'I1\n.'
'I1\n.'
>>> dumps('hello')
"S'hello'\np0\n."
"S'hello'\np1\n."
>>> dumps((1, 2, 'hello'))
"(I1\nI2\nS'hello'\np0\ntp1\n."
"(I1\nI2\nS'hello'\np1\ntp2\n."
是否存在任何针对某些类型的确定性的pickle的实现/协议组合(例如,只能将cPickle与协议0一起使用)?
选项2 – Repr和ast.literal_eval
另一种选择是使用repr来转储和加载ast.literal_eval.我编写了一个函数来确定给定的密钥是否能够在这个过程中存活(它允许的类型相当保守):
def is_reprable_key(key):
return type(key) in (int, str, unicode) or (type(key) == tuple and all(
is_reprable_key(x) for x in key))
这个方法的问题是,如果repr本身对于我允许的类型是确定性的.我相信由于str / unicode文字的改变,这将无法在2/3版本障碍中存活.对于2 ** 32 – 1 <1的整数,这也不适用. x< 2 ** 64在32位和64位平台之间跳转.是否还有其他条件(即在同一个解释器中不同条件下字符串序列化不同)?编辑:我只是想了解这种情况,但不一定要克服它们. 选项3:自定义代理 另一个可能过度杀伤的选择是编写我自己的repr,它会压缩我知道(或怀疑可能是)问题的repr.我刚刚在这里写了一个例子:http://gist.github.com/423945
(如果这一切都失败了,那么我可以存储密钥的散列以及密钥和值的pickle,然后遍历具有匹配散列的行,寻找一个对预期密钥进行unpickles的行,但这确实很复杂其他一些事情,我宁愿不这样做.编辑:it turns out内置哈希不是跨平台确定性的.抓一点.)
任何见解?
解决方法:
重要说明:如果在您尝试序列化的对象中嵌入了字典或集类型,则repr()不具有确定性.可以按任何顺序打印键.
例如,print repr({‘a’:1,’b’:2})可能打印为{‘a’:1,’b’:2}或{‘b’:2,’a’:1} ,取决于Python如何决定管理字典中的键.
内容总结
以上是互联网集市为您收集整理的python – 确定性密钥序列化全部内容,希望文章能够帮你解决python – 确定性密钥序列化所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。