Update comment and use of a different hash function.
This commit is contained in:
1 parent
cddf8712e4
commit
8e042435e5
1 file changed
+16
-6
+16
-6
@@ -58,22 +58,32 @@ ARRAY_DEF(array_string, string_t)
|
||||
|
||||
|
||||
|
||||
// The algorithm may not converge on all inputs.
|
||||
// Example: dictionnary with only 'a' and 'c' for which there is no seed
|
||||
// where the hash value diverge on the final bit.
|
||||
// The hash function doesn't provide the needed property.
|
||||
/* The algorithm may not converge on all inputs if the hash function
|
||||
* doesn't randomly distribute the inputs:
|
||||
* str1 != str2 ==> \exist seed \such_as hash(seed,str1) != hash(seed, str2)
|
||||
* The first hash function below doesn't provide the needed property for
|
||||
* inputs with two words 'a' and 'c'
|
||||
* The second one is more robust but may still have this issue.
|
||||
*/
|
||||
static uint32_t hash(int32_t seed, const char str[])
|
||||
{
|
||||
#if 0
|
||||
if (seed == 0) seed = 0x01000193;
|
||||
while (*str) {
|
||||
seed = ((seed * 0x01000193) ^ *str);
|
||||
str++;
|
||||
}
|
||||
return seed;
|
||||
#else
|
||||
if (seed == 0) seed = 0x811C9DC5;
|
||||
while (*str) {
|
||||
seed = (seed ^ *str) * 16777619;
|
||||
str++;
|
||||
}
|
||||
return seed ^ (seed >> 16);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Step 1: place all key keys into buckets
|
||||
static void
|
||||
CreateMinimalPerfectHash1(array_seed_t seed, array_value_t value,
|
||||
|
||||
Reference in new issue
Block a user