2014-10-06 33 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

相關問題