Positive ganze Zahl aus Python-hash () - Funktion
Möchte ich mit der Python - hash()
- Funktion, um integer-hashes von Objekten. Aber built-in hash()
geben kann negative Werte, und ich will nur positiv. Und ich will, dass es funktioniert vernünftig auf 32-bit-und 64-bit-Plattformen.
I. e. auf 32-bit-Python hash()
zurückkehren können, eine ganze Zahl im Bereich -2**31
zu 2**31 - 1
.
Auf 64-bit-Systemen hash()
zurückkehren können, eine ganze Zahl im Bereich -2**63
zu 2**63 - 1
.
Aber ich will ein hash im Bereich 0
zu 2**32-1
auf 32-bit-Systeme, und 0
zu 2**64-1
auf 64-bit-Systeme.
Was ist der beste Weg, um zu konvertieren der hash-Wert den entsprechenden positiven Wert innerhalb des Bereichs von 32 - oder 64-bit-Zielplattform?
(Kontext: ich versuche einen neuen zu machen random.Random
Stil Klasse. Nach der random.Random.seed()
docs, die Samen "optional argument x kann eine beliebige hashable-Objekt." Ich möchte also doppelte Funktionalität, außer, dass mein Samen Algorithmus nicht umgehen kann negative integer-Werte nur positiv sein.)
InformationsquelleAutor Craig McQueen | 2013-09-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit
sys.maxsize
:Alternative mit
ctypes.c_size_t
:sys.maxsize
war2**32
oder2**64
. Abersys.maxsize
ist eigentlich2**31-1
oder2**63-1
.Ich denke, ich könnte
(sys.maxint + 1) * 2)
und das beste hoffen.Du hast Recht. Ich aktualisierte den code. Danke.
Es gibt keinen Grund zu verwenden, ein Modul hier. Ich meine, sicher, es funktioniert, aber es ist weniger effizient und schwieriger zu Lesen.
Ich fügte hinzu, eine alternative Möglichkeit. Überprüfen Sie es heraus.
InformationsquelleAutor falsetru
Nur mit
sys.maxsize
falsch ist, aus offensichtlichen Gründen (es wird " 2*n-1 und nicht 2*n), aber die Lösung ist einfach genug:aus performance-Gründen möchten Sie vielleicht teilen Sie die sys.maxsize + 1 in zwei separate Zuordnungen zu vermeiden, erstellen eine lange Ganzzahl, die vorübergehend für die meisten negativen zahlen. Obwohl ich bezweifle, das ist die Materie viel
-0x7fffffffffffffff + sys.maxsize + 1
im 64bit-system.Ah ja stimmt, sollte nicht an Bedingungen geknüpft ist. Wo ist mein Kopf heute?
Warum
/2
statt*2
?Eigentlich ist es weder / noch * 2. Wir haben eine Reihe von
[-2**31, 2**31-1]
, aber wir wollen[-2**31+2**31, 2**31-1+2**31]
(Beispiel ist für 32bit-system). Es ist also nur eine Ergänzung, indem der untere Rand (2**31).. echt verwirrt heute bin ich.Ich sah die intermediate code.
InformationsquelleAutor Voo
Wie etwa:
Diese verwendet
sys.maxsize
tragbar sein zwischen 32 - und 64-bit-Systeme.-1
zu2**31 - 1
(32-bit) oder-1
zu2**63 - 1
(64-bit).InformationsquelleAutor unwind
(Edit: zuerst dachte ich, Sie wollte schon immer ein 32-bit-Wert)
Einfach UND es mit einer Maske in der gewünschten Größe. In der Regel
sys.maxsize
schon so eine Maske, da es eine 2er-Potenz minus 1.sorry, ich dachte, dass
maxsize
war schon die richtige Größe.InformationsquelleAutor Mark Ransom