It's easier for the client to pass in data directly than it is for the
client to stuff it into an array.
These functions will have new users in upcoming commits.
Some versions of GCC complain about violations of strict aliasing
rules due to a cast between different pointer types. This avoids
any aliasing by copying the value first.
As previously defined, the following both returned the same value for
given values of 'basis':
hash_int(0, hash_int(1, basis))
hash_int(1, hash_int(0, basis))
because hash_int(0, basis) evaluated to basis and hash_int(1, basis)
evaluated to c + basis for some constant c.
This commit fixes the problem, by eliminating any simple linear
relationship between basis and the hash value.
We should write some tests for hash function quality.