Hash-Funktion in Python 3.3 gibt verschiedene Ergebnisse zwischen den Sessions zurück

Ich habe einen BloomFilter in Python 3.3 implementiert und bekam verschiedene Ergebnisse jeder Session. Drilling dieses komische Verhalten hat mich auf die interne Hash () -Funktion – es gibt verschiedene Hash-Werte für den gleichen String jede Sitzung.

Beispiel:

>>> hash("235") -310569535015251310 

—– Eröffnung einer neuen Pythonenkonsole —–

 >>> hash("235") -1900164331622581997 

Warum passiert dies? Warum ist das nützlich?

3 Solutions collect form web for “Hash-Funktion in Python 3.3 gibt verschiedene Ergebnisse zwischen den Sessions zurück”

Python verwendet einen zufälligen Hash-Saatgut, um Angreifer daran zu hindern, Ihre Anwendung zu tar-pitting, indem sie Ihnen Schlüssel entwirft, um zu kollidieren. Siehe die ursprüngliche Anfälligkeitserklärung . Durch den Ausgleich der Hash mit einem zufälligen Samen (einmal beim Start eingestellt) können Angreifer nicht mehr vorhersagen, welche Tasten kollidieren.

Sie können einen festen Samen festlegen oder die Funktion deaktivieren, indem Sie die Umgebungsvariable PYTHONHASHSEED . Die Voreinstellung ist random aber Sie können sie auf einen festen positiven Integer-Wert setzen, wobei 0 die Funktion insgesamt deaktiviert.

Python-Versionen 2.7 und 3.2 haben die Funktion standardmäßig deaktiviert (verwenden Sie den Schalter -R oder setzen Sie PYTHONHASHSEED=random , um es zu aktivieren); Es ist standardmäßig in Python 3.3 und höher aktiviert.

Wenn Sie sich auf die Reihenfolge der Schlüssel in einem Python Wörterbuch oder Set verlassen, dann nicht. Python verwendet eine Hash-Tabelle, um diese Typen zu implementieren und ihre Reihenfolge hängt von der Einfügungs- und Löschvorgang sowie dem zufälligen Hash-Seed ab.

Siehe auch das object.__hash__() spezielle Methodendokumentation :

Hinweis : Standardmäßig werden die Werte __hash__() von str, bytes und datetime-Objekten mit einem unvorhersehbaren Zufallswert "gesalzen". Obwohl sie innerhalb eines einzelnen Python-Prozesses konstant bleiben, sind sie nicht zwischen den wiederholten Aufrufen von Python vorhersehbar.
Dies soll einen Schutz gegen eine Denial-of-Service bieten, die durch sorgfältig ausgewählte Eingaben verursacht wird, die die schlimmste Ausführung einer Dict-Insertion, O (n ^ 2) -Komplexität ausnutzen. Weitere Informationen finden Sie unter http://www.ocert.org/advisories/ocert-2011-003.html .
Das Ändern von Hash-Werten wirkt sich auf die Iterationsreihenfolge von Dicts, Sets und anderen Zuordnungen aus. Python hat nie Garantien über diese Bestellung (und es ist typischerweise zwischen 32-Bit und 64-Bit-Builds variiert).
Siehe auch PYTHONHASHSEED .

Wenn Sie eine stabile Hash-Implementierung benötigen, möchten Sie sich wahrscheinlich das hashlib Modul hashlib . Dies implementiert kryptografische Hash-Funktionen. Das pybloom-Projekt nutzt diesen Ansatz .

Da der Versatz aus einem Präfix und einem Suffix besteht (Startwert und endgültiger XOR-Wert), kann man den Offset leider nicht speichern. Auf der positiven Seite bedeutet das, dass Angreifer den Offset auch nicht mit Timing-Attacken bestimmen können.

Hash-Randomisierung ist standardmäßig in Python 3 aktiviert . Dies ist ein Sicherheitsmerkmal:

Hash-Randomisierung soll Schutz vor einer Denial-of-Service bieten, die durch sorgfältig ausgewählte Inputs verursacht wird, die die schlimmste Fallleistung einer dict-Konstruktion ausnutzen

In früheren Versionen ab 2.6.8 können Sie es an der Kommandozeile mit -R oder der Option PYTHONHASHSEED umschalten .

Sie können es ausschalten, indem Sie PYTHONHASHSEED auf Null setzen.

Hash () ist eine Python -integrierte Funktion und verwendet sie, um einen Hash-Wert für Objekt zu berechnen, nicht für String oder Num.

Sie können das Detail auf dieser Seite sehen: https://docs.python.org/3.3/library/functions.html#hash .

Und hash () -Werte stammen aus der __hash__-Methode des Objekts. Der doc sagt die folgenden:

Standardmäßig werden die Hash- () -Werte von str, bytes und datetime-Objekten mit einem unvorhersehbaren Zufallswert "gesalzen". Obwohl sie innerhalb eines einzelnen Python-Prozesses konstant bleiben, sind sie nicht zwischen den wiederholten Aufrufen von Python vorhersehbar.

Das ist der Grund, warum du einen falschen Hashwert für denselben String in der verschiedenen Konsole hast.

Was du implementierst, ist kein guter Weg.

Wenn du einen String-Hash-Wert berechnen willst, benutze einfach hashlib

Hash () ist Ziel, ein Objekt Hash-Wert, nicht ein Stirng erhalten.

  • Was macht Hash in Python?
  • Wann ist ein Hammel-Hash berechnet und warum ist der Hash von -1 anders?
  • Python Hash Funktionen
  • Wie verschlüsselt man alle möglichen Strings in einer definierten Zeichensatz-Python?
  • Python Portable Hash
  • Python unhash Wert
  • Mit pickle.dumps zu Hash-mutable Objekte
  • Hashing Tupel in Python verursacht unterschiedliche Ergebnisse in verschiedenen Systemen
  • Wie kann man __hash__ definieren, wenn ein Objekt gleich einer anderen Art von Objekten sein kann?
  • Effizient erzeugen Sie einen 16-stelligen, alphanumerischen String
  • Warum sind keine Python-Sets hashable?
  • Python ist die beste Programmiersprache der Welt.