- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在编写一个持久保存到磁盘的映射类。我目前只允许 str
键,但如果我可以使用更多类型会很好:希望最多可以是任何可散列的(即与内置 dict
相同的要求),但更合理的是我会接受字符串、unicode、int 和元组这些类型。
为此,我想推导出一个确定性的序列化方案。
我的第一个想法是使用 pickle(或 cPickle)模块序列化 key ,但我注意到 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
的实现/协议(protocol)组合?这对于某些类型集是确定性的(例如,只能将 cPickle
与协议(protocol) 0 一起使用)?
另一种选择是使用 repr
转储和ast.literal_eval
载入。我写了一个函数来确定给定的 key 是否会在这个过程中存活下来(它在它允许的类型上相当保守):
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 < x < 2**64
的整数。在 32 位和 64 位平台之间跳转。是否有任何其他条件(即字符串在同一解释器的不同条件下序列化是否不同)? 编辑:我只是想了解它崩溃的条件,不一定要克服它们。
另一个可能矫枉过正的选择是编写我自己的 repr
这使我知道(或怀疑可能是)问题的 repr 的事情变平了。我刚刚在这里写了一个例子:http://gist.github.com/423945
(如果这一切都惨遭失败,那么我可以将键的散列与键和值的 pickle 一起存储,然后遍历具有匹配散列的行,寻找可以解开到预期键的行,但是确实会使其他一些事情复杂化,我宁愿不这样做。编辑: it turns out 内置 hash
也不是跨平台的确定性。从头开始。)
有什么见解吗?
最佳答案
重要说明:如果字典或集合类型嵌入到您尝试序列化的对象中,则 repr()
不是确定性的。 key 可以按任何顺序打印。
例如 print repr({'a':1, 'b':2})
可能打印出 {'a':1, 'b':2}
或 {'b':2, 'a':1}
,取决于 Python 决定如何管理字典中的键。
关于python - 确定性 key 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2966684/
我使用 Deflater 编写了一个备份程序SHA-1 用于存储文件和哈希值。我看到Java的Deflater使用zlib 。如果我显式设置 Deflater 的级别,无论平台和 JRE 版本如何,我
考虑以下算法: r = 2 while r >= 1: x = -1 + 2 * random.random() y = -1 + 2 * random.random() r
我正在编写一个持久保存到磁盘的映射类。我目前只允许 str键,但如果我可以使用更多类型会很好:希望最多可以是任何可散列的(即与内置 dict 相同的要求),但更合理的是我会接受字符串、unicode、
我有一个不使用随机化的脚本,当我运行它时会给出不同的答案。我希望每次运行脚本时答案都是一样的。该问题似乎只发生在某些(病态)输入数据上。 该代码段来自一种计算线性系统特定类型 Controller 的
这对我来说不是问题,没有它我也可以生活,但我只是好奇这是否可能以及如何实现。 今天我了解到,scrapy.Request 不会按照启动的顺序完成。 伪代码示例: class SomeSpider(sc
我正在运行这个 SVD来自 scipy 的求解器,代码如下: import numpy as np from scipy.sparse.linalg import svds features = np
我正在尝试使用确定性 Miller-Rabin 算法实现素数检查功能,但结果并不总是正确的:在检查前 1,000,000 个数字时,它只找到 78,495 而不是 78,498。 这是使用 [2, 7
我正在审查各种 Android 声音 API,我想知道我应该使用哪一个。我的目标是获得低延迟的音频,或者至少是关于播放延迟的确定性行为。 我们遇到了很多问题,Android 声音 API 似乎很垃圾,
过去,我处理过对时间要求严格的软件开发。这些应用程序的开发基本上是这样进行的:“让我们编写代码,测试延迟和抖动,并优化它们,直到它们在可接受的范围内。”我觉得这非常令人沮丧。这不是我所说的 适当的工程
给定: SQL Server 表名为 TEST_TABLE TEST_TABLE 中名为 TEST_FIELD 的列 VARCHAR(50) NOT NULL 第 1 行:10YR3/6 第 2 行:
我在 64 位 Windows PC 上使用 Microsoft Visual Studio Community 2015,版本 14.xxx。 程序读取一个文本文件,其中每一行都是桥牌(四名玩家,每
我需要在 PHP 中创建一个可证明公平(确定性和种子)加密安全 (CS) 随机数生成器。我们正在运行 PHP 5,而 PHP 7 现在并不是一个真正的选择。但是,我找到了 PHP 7 的新 CS 函数
我是一名优秀的程序员,十分优秀!