2017-12-23 18 views
-3

Wenn ich mit Integer-Hash-Verfahren wurde unter Verwendung es gleiche ganze Zahl.__ Hash __() Verhalten unterscheidet sich mit Integer und String

>>> s=1 
>>> s.__hash__() 
1 

zurückkehren Aber wenn ich Hash-Methode mit String unter Verwendung Es gibt viele Zahlen

>>> s="String" 
>>> s[0].__hash__() 
-942210382 
>>> s.__hash__() 
-985060378 

Wie funktioniert es, wie erzeugt der Hash-Wert?

+2

In Python passieren die meisten kleinen 'int's Hash an sich selbst, offensichtlich können Strings das nicht, was findest du hier überraschend? Was genau ist deine Frage? –

+0

Was meinst du * "wie" *? Dies ist ein Implementierungsdetail auf Interpreterebene; Das Verhalten von CPython kann sich von anderen unterscheiden. Siehe z.B. https://docs.python.org/3/library/functions.html#hash, https://docs.python.org/3/reference/datamodel.html#object.__hash__. – jonrsharpe

+1

Ich denke, Hash-Wert kann ein Speicherort sein. string und tuple sind hashbar und list und dict sind nicht hashbar. Was ist Hashwert? – Artier

Antwort

3

Ein Hash ist nur ein Wert, der von den gegebenen Daten abgeleitet wird. Es wird auf eine Weise berechnet, von der man hofft, dass sie einen einzigartigen Wert für einzigartige Daten liefert, obwohl dies nicht garantiert ist, da sie oft weit weniger Bits enthält als die Daten selbst.

Der Hashwert kann eine beliebige Zahl sein. Angenommen, Sie können einen Wert von __hash__() erhalten, den Sie möglicherweise von einem Randomizer erhalten.

Anscheinend ist der Hash-Wert für eine ganze Zahl ist einfach selbst, weil ein eigener Wert der ganzen Zahl eindeutig identifiziert sie, so erhalten Sie eine 1 aus einem 1.

Der Hash-Wert für einen String ein Wert ist, der auf basiert einige Berechnungen mit jedem Zeichen in der Zeichenfolge. Daher ist es viel weniger vorhersehbar und kann sehr oft sehr groß und möglicherweise negativ sein. So läuft es.

Beachten Sie, dass s[0] konzeptionell das erste Zeichen der Zeichenfolge ist, aber es ist Hashed als eine Zeichenfolge aus einem Zeichen, weshalb Sie einen anderen, wenn auch ähnlichen Wert im Vergleich zu s selbst erhalten.

+1

nicht ganz, versuchen Sie 'Hash (-1)' –

+0

@Chris_Rands - Anscheinend so. Warum ist -1 besonders? –

+0

Ah, anscheinend -1 von einer internen C-Funktion zurückzugeben impliziert einen Fehler zu werfen, so dass die C-implementierte Hash-Funktion gehackt wird, um nicht -1 zurückzugeben. Verrückt. –

2

Die __hash__ Funktion einen ganzzahligen Wert zurückzubringen ist definiert:

Aufruf durch eingebaute Funktion hash() und für Operationen an Mitglieder der gehasht Sammlungen einschließlich Set, frozenset und dict.__hash__() sollte eine Rück ganze Zahl. Die einzige erforderliche Eigenschaft ist, dass Objekte , die gleich sind, den gleichen Hash-Wert haben;

Python Documentation

Eine Ganzzahl selbst eindeutig durch seinen eigenen Wert identifiziert. Eine Zeichenfolge muss irgendwie in eine eindeutige Ganzzahl (wie möglich) konvertiert werden.

Verwandte Themen