What is Hashing?
Let’s think about a function unsigned int hash(string)
. This function will take a string as a parameter and return a unique ID let’s say an unsigned integer. This is called a hash function. It’ll generate a unique ID for every unique string. And same unique ID over and over for same string. Things get complicated when the two different strings generate same ID. This is called a hash collision.
Hashing in C++
Let’s use std::hash
to generate hash for some string.
#include <functional> // std::hash
#include <iostream>
int main() {
std::hash<std::string> str_hash;
std::cout << str_hash("Hello") << '\n';
std::cout << str_hash("World") << '\n';
}
This syntax can be somewhat simplified to this. (maybe ?)
#include <functional> // std::hash
#include <iostream>
int main() {
std::cout << std::hash<std::string>{}("Hello World!") << '\n';
}
Well, we’ve used the std::hash
function to generate hash. But we don’t know yet which algorithm it uses! Let’s use some easy string hashing algorithm.
djb2 Hashing algorithm
This algorithm is very simple yet powerful enough to generate some good hash.
unsigned long hash(unsigned char *str) {
unsigned long hash = 5381;
int c;
while ((c = *str++))
hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
return hash;
}
Let’s use this algorithm.
#include <iostream>
namespace djb2 {
std::size_t hash(uint8_t *str) {
std::size_t hash = 5381;
int c;
while ((c = *str++))
hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
return hash;
}
std::size_t hash(const std::string &str) {
return hash((uint8_t *)str.c_str());
}
} // namespace djb2
int main() {
std::string s = "Hello World";
std::cout << djb2::hash(s) << '\n';
}