-1 ist in Python nicht als Fehler reserviert. Nicht sicher, was das überhaupt bedeuten würde. Es gibt eine große Anzahl von Programmen, die Sie nicht einfach und klar schreiben können, wenn Sie -1 nicht verwenden dürfen.
"Gibt es ein Problem?" Nein. Hash-Funktionen müssen für jedes Objekt keinen anderen Hashwert zurückgeben. In der Tat ist dies nicht möglich, da es viel mehr mögliche Objekte als Hashes gibt. CPythons hat die nette Eigenschaft, sein Argument für nicht-negative Zahlen bis zu sys.maxint
zurückzugeben, weshalb in Ihrer zweiten Frage hash(hash('s')) == hash('s')
, aber das ist ein Implementierungsdetail.
Die Tatsache, dass -1 und -2 den gleichen Hash haben, bedeutet einfach, dass die Verwendung dieser Werte wie zum Beispiel Dictionary Keys zu einem Hash-Konflikt führt. Hash-Konflikte sind eine erwartete Situation und werden automatisch von Python gelöst, und der zweite Schlüssel hinzugefügt würde einfach in den nächsten verfügbaren Steckplatz im Wörterbuch gehen. Der Zugriff auf den zweiten Schlüssel wäre dann etwas langsamer als der Zugriff auf den anderen Schlüssel, aber in den meisten Fällen nicht genug langsamer, dass Sie bemerken würden.
Es ist möglich, eine große Anzahl ungleicher Objekte mit demselben Hash-Wert zu konstruieren, was bei einer Speicherung in einem Dictionary oder einem Set die Performance des Containers erheblich verschlechtern würde, da jedes hinzugefügte Objekt einen Fehler verursachen würde Hash-Kollision, aber es ist nicht etwas, in das Sie hineinlaufen werden, wenn Sie nicht danach suchen.
"Ich obwohl Hash-Funktion auf anderen Objekt sollte verschiedene Werte zurückgeben" --- Nein, es sollte nur den gleichen Wert für das gleiche Objekt zurückgeben. – zerkms
Hashes garantiert keine Eindeutigkeit. –
Es ist jedoch seltsam, dass anders als -1, "Hash (i) == i" für "abs (i) <= 1.000.000". – chepner