32 vs 64 bits and large integer hash
Hi All, 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" ;-) _,,,^..^,,,_ best, Eliot
On 21 Nov 2018, at 19:45, Eliot Miranda <eliot.miranda@gmail.com> wrote:
Hi All,
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]
Thanks, I added an issue tracker entry: https://pharo.fogbugz.com/f/cases/22690/32-vs-64-bits-and-large-integer-hash I will do a pull request later (if not someone else is faster to do it). Marcus -- Marcus Denker -- marcus@2denker.de http://www.zweidenker.de
On 22 Nov 2018, at 10:47, Marcus Denker <marcus.denker@inria.fr> wrote:
On 21 Nov 2018, at 19:45, Eliot Miranda <eliot.miranda@gmail.com> wrote:
Hi All,
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]
Thanks, I added an issue tracker entry:
https://pharo.fogbugz.com/f/cases/22690/32-vs-64-bits-and-large-integer-hash
I will do a pull request later (if not someone else is faster to do it).
https://github.com/pharo-project/pharo/pull/2009 <https://github.com/pharo-project/pharo/pull/2009>
-- Marcus Denker -- marcus@2denker.de http://www.zweidenker.de
participants (2)
-
Eliot Miranda -
Marcus Denker