I have a hash_probe
function which takes a hash value, an index and an capacity to get the probe index by quadratic probing. I dont know why but as I tried different capabilities like 3, 5, 7, 11, 13, 17, 23
I saw that I would only hit every location from n to cap
for cap == 3, 7, 11, 23
.
Regarding to the answer by user "templatetypdef" and Wikipedia Examples of Quadratic Probing
You can try it below by changing TEST_PRIME
macro to any prime number.
What do I missunderstand or why does it work with 3, 7, 11, 23
but not with 5, 13, 17
?
Example output for Cap == 7 (as expected):
4
3
1
2
6
0
5
Example output for Cap == 5 (not as aspected):
0
4
4
1
1
#include <stdio.h>
#include <string.h>
// hashes str until nullbyte is found
size_t djb2(const char *str)
{
/* djb2 offset 5381 */
unsigned long hash = 5381;
int c;
while ((c = *str++))
hash = ((hash << 5) + hash) + (size_t) c; /* hash * 33 + c */
return hash;
}
// calculates the probe index by hash, index and capability
size_t hash_probe(unsigned long hash, size_t i, size_t cap)
{
size_t idx = 0;
if(i & 1) { // odd
idx = (hash + -(i*i)) % cap;
} else {
idx = (hash + (i*i)) % cap;
}
return idx;
}
#define TEST_PRIME 23
int main(void)
{
// get hash
unsigned long hash = djb2("Hallo Welt!\n");
// loop though 0 to TEST_PRIME and print its probe index value
for(size_t i = 0; i < TEST_PRIME; i++) {
size_t idx = hash_probe(hash, i, TEST_PRIME);
printf("%zu\n", idx);
}
return 0;
}