Use Bob Jenkins lookup3 hash instead of FNV.
authorBen Pfaff <blp@gnu.org>
Thu, 9 Apr 2009 04:55:31 +0000 (21:55 -0700)
committerBen Pfaff <blp@gnu.org>
Thu, 9 Apr 2009 14:07:29 +0000 (07:07 -0700)
commit2c411d651e22704f60f117d944b9380a07d247fe
tree94529b86721f84529fda5836ea82a8e6c8e43c1e
parent62c871225e944dbdb2a50e1253423952719145cf
Use Bob Jenkins lookup3 hash instead of FNV.

The Jenkins lookup3 hash is superior to FNV in collision resistance,
avalanching, and performance on systems that do not have fast
multiplication.  It also provides a good way to combine the result of
a previous hashing step with the current hash, using its "basis" argument.
This commit replaces the PSPP implementation of FNV with the Jenkins
lookup3 hash and updates all the current users.

In addition, John Darrington pointed out that commit dd2e61b4a
"Make create_iconv() properly distinguish converters by name"
unintentionally introduced gratuitous hash collisions, by causing
all converters where tocode and fromcode were the same to hash to
value 0, and converters where tocode and fromcode were swapped to
hash to the same value as each other.  Using the "basis" argument to
the Jenkins hash properly, instead of just attempting to combine
hash values with XOR, fixes this problem.
13 files changed:
src/data/attributes.c
src/data/file-handle-def.c
src/data/file-name.c
src/data/short-names.c
src/data/value-labels.c
src/data/value.c
src/data/variable.c
src/language/stats/autorecode.c
src/language/stats/crosstabs.q
src/libpspp/hash-functions.c
src/libpspp/hash-functions.h
src/libpspp/i18n.c
src/math/covariance-matrix.c