Potrzebowaliście kiedyś jakiegoś mniej standardowego hasha?
Zazwyczaj w hash table'u potrzebuje przechowa dość proste typy więc w moim przypadku kończy się to wciskaniem prymitywów do obszerniejszego typu obsługiwanego przez std::hash
, patrz kod niżej. Gdy mam więcej pól do hashowania to używam boost::hash_combine, a jak nie mam boosta w projekcie to po prostu kopiuje implementacje bo można ją sprowadzić do jednej linijki - seed ^= std::hash<T>(value) + 0x9e3779b9 + (seed<<6) + (seed>>2);
.
struct Pos2D
{
int x, y;
bool operator==(const Pos2D &other) const { return x == other.x && y == other.y; }
};
struct Pos2DHash
{
std::size_t operator()(const Pos2D &key) const
{
unsigned long long val = 0;
val |= static_cast<uint32_t>(key.y); // wiem, ze int nie ma gwarancji 4 bajtow - juz sie nie czepiajcie to tylko przyklad
val |= (static_cast<unsigned long long>(key.x) << 32) & 0xffffffff00000000;
return std::hash<unsigned long long>()(val);
}
};