2014-10-06 100 views
0

我有一个简单的python脚本,它可以腌制一个对象并将其打印出来。pickle.dumps在每次调用时都会返回一个不同的输出

import pickle 

o = {'first':1,'second':2,'third':3,'ls':[1,2,3]} 
d = pickle.dumps(o) 
print(d) 

以下是当我执行相同的脚本多次我得到的输出:

  • b'\x80\x03}q\x00(X\x05\x00\x00\x00firstq\x01K\x01X\x05\x00\x00\x00thirdq\x02K\x03X\x06\x00\x00\x00secondq\x03K\x02X\x02\x00\x00\x00lsq\x04]q\x05(K\x01K\x02K\x03eu.'

  • b'\x80\x03}q\x00(X\x05\x00\x00\x00thirdq\x01K\x03X\x02\x00\x00\x00lsq\x02]q\x03(K\x01K\x02K\x03eX\x05\x00\x00\x00firstq\x04K\x01X\x06\x00\x00\x00secondq\x05K\x02u.'

  • b'\x80\x03}q\x00(X\x05\x00\x00\x00firstq\x01K\x01X\x06\x00\x00\x00secondq\x02K\x02X\x02\x00\x00\x00lsq\x03]q\x04(K\x01K\x02K\x03eX\x05\x00\x00\x00thirdq\x05K\x03u.'

  • b'\x80\x03}q\x00(X\x05\x00\x00\x00thirdq\x01K\x03X\x05\x00\x00\x00firstq\x02K\x01X\x02\x00\x00\x00lsq\x03]q\x04(K\x01K\x02K\x03eX\x06\x00\x00\x00secondq\x05K\x02u.'

难道仅仅是在对象的属性进行排序的差异,还是有更多的呢?

回答

2

在Python 3中,字典顺序依赖于散列随机化。每次启动解释器时,都会使用不同的随机散列种子。如果你要打印字典,你会看到不同的排序太:

$ bin/python -c "o = {'first':1,'second':2,'third':3,'ls':[1,2,3]}; print(o)" 
{'first': 1, 'ls': [1, 2, 3], 'second': 2, 'third': 3} 
$ bin/python -c "o = {'first':1,'second':2,'third':3,'ls':[1,2,3]}; print(o)" 
{'ls': [1, 2, 3], 'third': 3, 'first': 1, 'second': 2} 
$ bin/python -c "o = {'first':1,'second':2,'third':3,'ls':[1,2,3]}; print(o)" 
{'second': 2, 'ls': [1, 2, 3], 'third': 3, 'first': 1} 

Python使用随机种子,以防止某些类型的拒绝服务攻击的抵抗解析传入的用户数据导入词典程序,例如作为网络服务器;这样的攻击可以预测两个字符串何时会在字典中引起散列冲突,并提供除了创建冲突外无所作为的Python值,从而减慢Python程序的爬行速度。

可以将种子设置为固定值与PYTHONHASHSEED environment variable,或者也可以完全禁用散列随机化:

的整数必须在范围[0,4294967295]的十进制数。指定值0将禁用哈希随机化。

$ PYTHONHASHSEED=0 bin/python -c "o = {'first':1,'second':2,'third':3,'ls':[1,2,3]}; print(o)" 
{'third': 3, 'ls': [1, 2, 3], 'first': 1, 'second': 2} 
$ PYTHONHASHSEED=0 bin/python -c "o = {'first':1,'second':2,'third':3,'ls':[1,2,3]}; print(o)" 
{'third': 3, 'ls': [1, 2, 3], 'first': 1, 'second': 2} 

另见:Why is the order in dictionaries and sets arbitrary?

+0

有趣的是,我需要等待另外7分钟,然后我可以接受这个职位,即使我得到了我想要从这个答案不到一分钟。 – 2014-10-06 14:59:04

相关问题