[英]pickle.dumps returns a different output on each call
我有一個簡單的python腳本,可以腌制一個對象並將其打印出來。
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.'
它僅僅是對象屬性順序上的差異還是更多?
在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使用隨機種子來防止針對將傳入的用戶數據解析為字典(例如Web服務器)的程序的某些類型的拒絕服務攻擊。 否則,這樣的攻擊可能會預測兩個字符串何時會在字典中引起哈希沖突,並饋給Python值,這些值只會產生沖突,從而使Python程序的爬網速度變慢。
您可以使用PYTHONHASHSEED
環境變量將種子設置為固定值,也可以完全禁用哈希隨機化:
整數必須是[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}
另請參閱: 為什么字典和集合中的順序是任意的?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.