Fix FNV bug on 64-bit Windows (hashes being cut off to 32-bit) #211
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
I observed an issue in my app where many input values (of a nested record type) were being hashed to the same value, and eventually determined it was only happening on Windows. After tracing the problem back, I noticed
Text
values were always being hashed to 32-bit values, and that when I combined the hashes of(record, text)
, the input record hash (used as salt) was also being cut off to 32-bit.That led me to these issues with
fnv.c
. It is usinglong
which is 32 bits on 64-bit Windows. However HaskellInt
, as well asWORD_SIZE_IN_BITS
, are 64. So hashes in general are 64-bit, but then getting improperly cut off when they interact with this code, such as throughText
and other byte array types. I also noticed theFNV_PRIME
constant added recently was not actually being used; I assume it was supposed to replace the numeric constant in the function below.I tested that this fixes the hash behavior in my app, but I have not tested on a 32-bit platform yet.