From 360b9c8c8b4c4364b755dc0935f05e4ba4429cb0 Mon Sep 17 00:00:00 2001 From: Thomas Gschwantner Date: Sun, 8 Dec 2019 04:35:50 +0100 Subject: Use siphash for hashtables --- khash.h | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) (limited to 'khash.h') diff --git a/khash.h b/khash.h index 445ee3d..0769711 100644 --- a/khash.h +++ b/khash.h @@ -129,6 +129,9 @@ int main() { #include #include +#include "random.h" +#include "siphash.h" + /* compiler specific configuration */ #if UINT_MAX == 0xffffffffu @@ -197,6 +200,7 @@ static const double __ac_HASH_UPPER = 0.77; khint32_t *flags; \ khkey_t *keys; \ khval_t *vals; \ + siphash_key_t siphash_key; \ } kh_##name##_t; #define __KHASH_PROTOTYPES(name, khkey_t, khval_t) \ @@ -210,7 +214,10 @@ static const double __ac_HASH_UPPER = 0.77; #define __KHASH_IMPL(name, SCOPE, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) \ SCOPE kh_##name##_t *kh_init_##name(void) { \ - return (kh_##name##_t*)kcalloc(1, sizeof(kh_##name##_t)); \ + kh_##name##_t *s = kcalloc(1, sizeof(kh_##name##_t)); \ + if (!get_random_bytes((uint8_t *)&s->siphash_key, 16)) \ + return NULL; \ + return s; \ } \ SCOPE void kh_destroy_##name(kh_##name##_t *h) \ { \ @@ -629,20 +636,13 @@ typedef const unsigned char *khwgkey_t; #define kh_wgkey_hash_equal(a, b) (memcmp(a, b, 32) == 0) -static kh_inline khint_t __fnv_1a_32_hash(const unsigned char *wgkey) -{ - khint_t hash = 0x811c9dc5UL; - for (int i = 0; i < 32; ++i) { - hash ^= wgkey[i]; - hash *= 16777619UL; - } - return hash; -} +#define __SIPHASH(key) ((khint32_t) siphash(key, 32, &h->siphash_key)) +#define __SIPHASH_u64(key) ((khint32_t) siphash_1u64(key, &h->siphash_key)) -#define KHASH_SET_INIT_WGKEY(name) \ - KHASH_INIT(name, khwgkey_t, char, 0, __fnv_1a_32_hash, kh_wgkey_hash_equal) +#define KHASH_MAP_INIT_SECURE_INT64(name, khval_t) \ + KHASH_INIT(name, khint64_t, khval_t, 1, __SIPHASH_u64, kh_int64_hash_equal) -#define KHASH_MAP_INIT_WGKEY(name, khval_t) \ - KHASH_INIT(name, khwgkey_t, khval_t, 1, __fnv_1a_32_hash, kh_wgkey_hash_equal) +#define KHASH_MAP_INIT_SECURE_WGKEY(name, khval_t) \ + KHASH_INIT(name, khwgkey_t, khval_t, 1, __SIPHASH, kh_wgkey_hash_equal) #endif /* __AC_KHASH_H */ -- cgit v1.2.3-59-g8ed1b