Files
KytyPS5/src/common/hash.h
T
2026-09-17 20:35:36 +04:00

60 lines
1.0 KiB
C++

#ifndef KYTY_COMMON_HASH_H_
#define KYTY_COMMON_HASH_H_
#include "common/common.h"
namespace Common {
inline uint32_t hash(const void* key, uint32_t key_len) {
uint32_t hash = 0;
const auto* ptr = static_cast<const uint8_t*>(key);
while (key_len >= 4) {
hash += ptr[0];
hash += (hash << 10u);
hash ^= (hash >> 6u);
hash += ptr[1];
hash += (hash << 10u);
hash ^= (hash >> 6u);
hash += ptr[2];
hash += (hash << 10u);
hash ^= (hash >> 6u);
hash += ptr[3];
hash += (hash << 10u);
hash ^= (hash >> 6u);
key_len -= 4;
ptr += 4;
}
switch (key_len) {
case 3:
hash += ptr[2];
hash += (hash << 10u);
hash ^= (hash >> 6u);
[[fallthrough]];
case 2:
hash += ptr[1];
hash += (hash << 10u);
hash ^= (hash >> 6u);
[[fallthrough]];
case 1:
hash += ptr[0];
hash += (hash << 10u);
hash ^= (hash >> 6u);
[[fallthrough]];
default: break;
}
hash += (hash << 3u);
hash ^= (hash >> 11u);
hash += (hash << 15u);
return hash;
}
} // namespace Common
#endif /* KYTY_COMMON_HASH_H_ */