2015-07-01 12 views
13

Ich habe ein wirklich seltsames Verhalten mit der Hash-Funktion auf Python. Wenn ich den folgenden Befehl unter Mac OS (10.10) ausführe, bekomme ich unterschiedliche Werte von verschiedenen Anrufen.Warum ändert sich Hash (None) auf verschiedenen Plattformen und in verschiedenen Aufrufen?

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

In der anderen Hand, wenn ich die gleiche Sache auf Ubuntu 14.04 laufen erhalte ich:

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

Für mich ist es wie folgt aussieht, in OS X, Python die Speicheradresse irgendwie verwendet, und Ubuntu nicht. Daraus kann ich ersehen, dass die Hash-Funktion wahrscheinlich implementierungsabhängig ist. Aber sollte es nicht nur auf dem "Wert" von None basieren? Was bedeuten diese Zahlen? Warum verhält es sich selbst auf der gleichen Python-Version anders als auf anderen Betriebssystemen?

+2

Verwandte: http://stackoverflow.com/q/7681786/1639625 –

+0

Welche Version (en) von Python? – jonrsharpe

+0

@tobias_k Danke, das habe ich gesehen. Aber es sagt mir nicht, warum es sich auf beiden Betriebssystemen anders verhält. –

Antwort

2

None.__hash__ entspricht der Hashing-Funktion . Im Grunde wird der Zeiger des Objekts als Hash verwendet. Für None als Singleton ist dies sicher zu verwenden, aber nicht deterministisch. Für einen Zeiger Guss auf einen angemessenen Integer-Typen p der Hash-Wert wie folgt berechnet wird:

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

diesbezüglichen Kommentar im Quellcode Zuständen:

Boden 3 oder 4 Bits sind wahrscheinlich um 0 zu sein; drehen y von 4 bis übermäßige Hash-Kollisionen für dicts zu vermeiden und setzt

Verwandte Themen