Skip to content

Instantly share code, notes, and snippets.

@MohamedTaha98
Created October 5, 2017 22:06
Show Gist options
  • Save MohamedTaha98/ccdf734f13299efb73ff0b12f7ce429f to your computer and use it in GitHub Desktop.
Save MohamedTaha98/ccdf734f13299efb73ff0b12f7ce429f to your computer and use it in GitHub Desktop.
// Djb2 hash function
unsigned long hash(char *str) {
unsigned long hash = 5381;
int c;
while ((c = *str++))
hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
return hash % NUM_BUCKETS;
}
@BlachTheHole
Copy link

thanks very cool

@mongnak
Copy link

mongnak commented Sep 18, 2021

hi I'm noob
what does while ((c=*str++)) means?

@FtZPetruska
Copy link

hi I'm noob what does while ((c=*str++)) means?

Hi,

In C when you do an assignment like x = 2, it's considered a function, so if(x = 2) would be evaluated as true.

Now if we break down the statement in the while we:

  • de-reference str (*str), in other words, we get the character at this address in the string.
  • we assign the value to c.
  • we advance the str pointer to the next character (str++).
    As said earlier, the character assigned to c gets evaluated as a boolean, the last character of a C string '\0' is evaluated to false so the while loop exits when reaching the end of the string.

Hope that helped!

@PeterTreichel
Copy link

Thanks for the code! helped me build a hash table for CS50 course.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment