2016-10-28 4 views
3

Wie wird ein Hash-Wert einer bestimmten Zeichenfolge in CPython2.7 berechnet?Python Hash() Funktion auf Strings

Zum Beispiel dieser Code:

print hash('abcde' * 1000) 

den gleichen Wert zurückgibt, auch nachdem ich den Python-Prozess neu starten, und versuchen Sie es erneut (ich habe es viele Male).

So scheint es, dass id() (Speicheradresse) der String nicht in dieser Berechnung verwendet wird, nicht wahr? Wie dann?

+2

„gibt den gleichen Wert auch nachdem ich das Python-Prozess und versuchen Sie es erneut starten“ - nicht garantiert, und in der Regel nicht wahr auf Python 3. "Es scheint, dass ID() (Speicheradresse) der Zeichenfolge nicht in dieser Berechnung verwendet wird" - na ja, natürlich nicht. Andernfalls hätten wir nicht die Invariante, dass "a == b" impliziert "hash (a) == hash (b)". – user2357112

+0

Ich denke, Sie müssen 'help (hash)' und 'help (id)' ausführen, um den Unterschied zwischen den beiden zu verstehen, weil sie nicht gleich sind ... –

+1

Vielleicht wird dieser Thread etwas Licht vergießen? http://stackoverflow.com/questions/6008026/how-hash-is-implemented-in-python-3-2 – BorrajaX

Antwort

8

Hash-Werte sind auf dem Speicherplatz nicht abhängig, sondern der Inhalt des Objekts selbst. Von der documentation:

Geben Sie den Hash-Wert des Objekts zurück (wenn es eins hat). Hash-Werte sind Ganzzahlen. Sie werden verwendet, um Wörterbuchschlüssel während einer Wörterbuchsuche schnell zu vergleichen. Numerische Werte, die mit "Gleich" verglichen werden, haben denselben Hash-Wert (auch wenn sie unterschiedlichen Typs sind, wie es bei 1 und 1,0 der Fall ist).

Sie können hier den Quellcode für CPython Umsetzung des hash Methode der str Klasse check out:

https://svn.python.org/projects/python/trunk/Objects/stringobject.c

+0

danke. so scheint es, dass der Hash (String) von Lauf zu Lauf identisch sein wird, oder? –

+4

@ d-d Nein, es ist nicht garantiert, dass sie jedes Mal gleich sind, aber es wird garantiert, dass sie denselben Wert innerhalb desselben Prozesses zurückgeben. Wenn Sie einen sich nicht ändernden Hash verwenden möchten, verwenden Sie stattdessen [hashlib] (https://docs.python.org/3/library/hashlib.html) Funktionen. – Selcuk

+0

Ja, ich habe darüber nachgedacht, aber ich brauche etwas schneller als jede Hash-Funktion in diesem Modul. sein Murmeln Hash oder so .. –