|
[Pharo-dev] 32 vs 64 bits and large integer hash
right now we have the following definition of Large(Positive)Integer>>hash:
hash
^ByteArray hashBytes: self startingWith: self species hash
which means that for all integers outside of the 32-bit SmallInteger range (-2 ^ 30 to 2 ^ 30 - 1), the 32-bit system and the 64-bit system answer different values for hash.
e.g. in 64 bits: (2 raisedTo: 30) hash 1073741824
but in 32 bits: (2 raisedTo: 30) hash 230045764
This is unsatisfactory. I propose changing Large(Positive)Integer>>hash to
hash
^self digitLength <= 8
ifTrue: [self]
ifFalse: [ByteArray hashBytes: self startingWith: self species hash]
P.S. Note that this will not break Float hash, which is defined as
Float>>hash
"Hash is reimplemented because = is implemented. Both words of the float are used. (The bitShift:'s ensure that the intermediate results do not become a large integer.) Care is taken to answer same hash as an equal Integer."
(self isFinite and: [self fractionPart = 0.0]) ifTrue: [^self truncated hash].
^ ((self basicAt: 1) bitShift: -4) +
((self basicAt: 2) bitShift: -4)
P.P.S. I *think* that "(self isFinite and: [self fractionPart = 0.0])" is equivalent to "self - self = self fractionPart" ;-)
|
|
|
Priority: 5 – Fix If Time
|
|
Status: Work Needed
|
|
Assigned to: Everyone
|
|
Milestone: Pharo7.0
|
Go to Case
|
|