Jainish
Jainish

Reputation: 89

djb2 Hash Function

I am using the djb2 algorithm to generate the hash key for a string which is as follows

hash(unsigned char *str)
{
    unsigned long hash = 5381;
    int c;

    while (c = *str++)
        hash = ((hash << 5) + hash) + c; /* hash * 33 + c */

    return hash;
}

Now with every loop there is a multiplication with two big numbers, After some time with the 4th of 5th character of the string there is a overflow as the hash value becomes huge

What is the correct way to refactor so that the hash value does not overflow and the hashing also happens correctly

Upvotes: 8

Views: 27406

Answers (5)

Marius Ologesa
Marius Ologesa

Reputation: 381

Note that lately there is a Microsoft implementation for this method, which probably is safer and more performant than the above.

StringExtensions.GetDjb2HashCode

Upvotes: 0

Duy Truong
Duy Truong

Reputation: 19

return (hash & 0xFFFFFFFF); // or whatever mask you want, doesn't matter as long as you keep it consistent.

Upvotes: 1

Davy Landman
Davy Landman

Reputation: 15438

I'm thinking your using a static/runtime analyser to warn about integer overflows? Well this is one of those cases where you can ignore the warning. Hash functions are designed for specific types of properties, so don't worry about the warnings from your analyser. Just don't try to create a hash function yourself!

Upvotes: 4

Luk&#225;š Lalinsk&#253;
Luk&#225;š Lalinsk&#253;

Reputation: 41316

You shouldn't do that. Since there is no modulo, integer overflow is the expected behavior for the function (and it was designed with it in mind). Why do you want to change it?

Upvotes: 5

Jon Skeet
Jon Skeet

Reputation: 1502686

Hash calculations often overflow. That's generally not a problem at all, so long as you have guarantees about what's going to happen when it does overflow. Don't forget that the point of a hash isn't to have a number which means something in terms of magniture etc - it's just a way of detecting equality. Why would overflow interfere with that?

Upvotes: 21

Related Questions