簡體   English   中英

pickle.dumps在每次調用時返回不同的輸出

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM