2015-07-01 15 views
13

我正在面對Python上散列函數的一個非常奇怪的行爲。當我在Mac OS(10.10)上運行以下命令時,會從不同的調用中獲得不同的值。爲什麼散列(無)在不同的平臺和不同的調用中改變?

$ python -c "print hash(None)" 
-9223372036579216774 
$ python -c "print hash(None)" 
-9223372036582852230 

在另一方面,當我在Ubuntu 14.04上運行同樣的事情,我得到:

$ python -c "print hash(None)" 
596615 
$ python -c "print hash(None)" 
596615 

對於我來說,它看起來像,在OS X,Python是莫名其妙地使用內存地址和Ubuntu是不。從這我可以看到哈希函數可能是實現相關的。但是,它不應該只基於None的「價值」嗎?這些數字代表什麼?爲什麼即使在相同的Python版本上,但在不同的操作系統上,其行爲也不同?

+2

相關:http://stackoverflow.com/q/7681786/1639625 –

+0

Python的哪個版本? – jonrsharpe

+0

@tobias_k謝謝,我看到了。但它並沒有告訴我爲什麼它在兩個操作系統上表現不同。 –

回答

2

None.__hash__與散列函數相關。所以基本上這個對象的指針被用作散列。對於None這是一個單身人士,這是安全的使用,但不是確定性的。對於一個指針轉換爲適當的整數類型p哈希值被計算如下所示:

(p >> 4) | (p << (8 * SIZEOF_VOID_P - 4)) 

參照該源代碼的狀態的註釋:

底部3或4位有可能爲0;將y旋轉4以避免針對字符和集合的過度散列衝突

相關問題