51 lines
904 B
C
51 lines
904 B
C
#include "hash.h"
|
|
#include <stddef.h>
|
|
#include <stdlib.h>
|
|
|
|
Hasher* hasher_new()
|
|
{
|
|
Hasher* hasher = malloc(sizeof(Hasher));
|
|
*hasher = (Hasher) {};
|
|
return hasher;
|
|
}
|
|
|
|
uint64_t hasher_finish(Hasher hasher)
|
|
{
|
|
return hasher.state;
|
|
}
|
|
|
|
void hasher_free(Hasher* hasher)
|
|
{
|
|
free(hasher);
|
|
}
|
|
|
|
void hasher_hash_u64(Hasher* hasher, uint64_t v)
|
|
{
|
|
uint64_t value = hasher->state + v;
|
|
|
|
value ^= value >> 33;
|
|
value *= 0xff51afd7ed558ccdL;
|
|
value ^= value >> 33;
|
|
value *= 0xc4ceb9fe1a85ec53L;
|
|
value ^= value >> 33;
|
|
|
|
hasher->state = value;
|
|
}
|
|
|
|
void hasher_hash_u8(Hasher* hasher, uint8_t v)
|
|
{
|
|
hasher_hash_u64(hasher, v);
|
|
}
|
|
|
|
void string_hash(Hasher* hasher, const char* str)
|
|
{
|
|
for (size_t i = 0; str[i] != '\0'; ++i) {
|
|
hasher_hash_u8(hasher, (uint8_t)str[i]);
|
|
}
|
|
}
|
|
|
|
void size_hash(Hasher* hasher, size_t value)
|
|
{
|
|
hasher_hash_u64(hasher, (uint64_t)value);
|
|
}
|