|
|
|
@ -30,13 +30,15 @@
|
|
|
|
|
#include <qse/types.h>
|
|
|
|
|
#include <qse/macros.h>
|
|
|
|
|
|
|
|
|
|
#if MOO_SIZEOF_SIZE_T == 4
|
|
|
|
|
#if (QSE_SIZEOF_SIZE_T == 4)
|
|
|
|
|
# define QSE_HASH_FNV_MAGIC_INIT (0x811c9dc5)
|
|
|
|
|
# define QSE_HASH_FNV_MAGIC_PRIME (0x01000193)
|
|
|
|
|
#elif MOO_SIZEOF_SIZE_T == 8
|
|
|
|
|
#elif (QSE_SIZEOF_SIZE_T == 8)
|
|
|
|
|
|
|
|
|
|
# define QSE_HASH_FNV_MAGIC_INIT (0xCBF29CE484222325)
|
|
|
|
|
# define QSE_HASH_FNV_MAGIC_PRIME (0x100000001B3)
|
|
|
|
|
#elif MOO_SIZEOF_SIZE_T == 16
|
|
|
|
|
# define QSE_HASH_FNV_MAGIC_PRIME (0x100000001B3l)
|
|
|
|
|
|
|
|
|
|
#elif (QSE_SIZEOF_SIZE_T == 16)
|
|
|
|
|
# define QSE_HASH_FNV_MAGIC_INIT (0x6C62272E07BB014262B821756295C58D)
|
|
|
|
|
# define QSE_HASH_FNV_MAGIC_PRIME (0x1000000000000000000013B)
|
|
|
|
|
#endif
|
|
|
|
@ -45,47 +47,56 @@
|
|
|
|
|
/* FNV-1 hash */
|
|
|
|
|
# define QSE_HASH_INIT QSE_HASH_FNV_MAGIC_INIT
|
|
|
|
|
# define QSE_HASH_VALUE(hv,v) (((hv) ^ (v)) * QSE_HASH_FNV_MAGIC_PRIME)
|
|
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
/* SDBM hash */
|
|
|
|
|
# define QSE_HASH_INIT 0
|
|
|
|
|
# define QSE_HASH_VALUE(hv,v) (((hv) << 6) + ((hv) << 16) - (hv) + (v))
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#define QSE_HASH_VALUES(hv, ptr, len, type) do { \
|
|
|
|
|
#define QSE_HASH_VPTL(hv, ptr, len, type) do { \
|
|
|
|
|
hv = QSE_HASH_INIT; \
|
|
|
|
|
QSE_HASH_MORE_VALUES (hv, ptr, len, type); \
|
|
|
|
|
QSE_HASH_MORE_VPTL (hv, ptr, len, type); \
|
|
|
|
|
} while(0)
|
|
|
|
|
|
|
|
|
|
#define QSE_HASH_MORE_VALUES(hv, ptr, len, type) do { \
|
|
|
|
|
type* p = (type*)(ptr); \
|
|
|
|
|
type* q = (type*)p + (len); \
|
|
|
|
|
while (p < q) { hv = QSE_HASH_VALUE(hv, *p); p++; } \
|
|
|
|
|
#define QSE_HASH_MORE_VPTL(hv, ptr, len, type) do { \
|
|
|
|
|
type* __qse_hash_more_values_p = (type*)(ptr); \
|
|
|
|
|
type* __qse_hash_more_values_q = (type*)__qse_hash_more_values_p + (len); \
|
|
|
|
|
while (__qse_hash_more_values_p < __qse_hash_more_values_q) \
|
|
|
|
|
{ \
|
|
|
|
|
hv = QSE_HASH_VALUE(hv, *__qse_hash_more_values_p); \
|
|
|
|
|
__qse_hash_more_values_p++; \
|
|
|
|
|
} \
|
|
|
|
|
} while(0)
|
|
|
|
|
|
|
|
|
|
#define QSE_HASH_VSTR(hv, ptr, type) do { \
|
|
|
|
|
#define QSE_HASH_VPTR(hv, ptr, type) do { \
|
|
|
|
|
hv = QSE_HASH_INIT; \
|
|
|
|
|
QSE_HASH_MORE_VALUES (hv, ptr, type); \
|
|
|
|
|
QSE_HASH_MORE_VPTL (hv, ptr, type); \
|
|
|
|
|
} while(0)
|
|
|
|
|
|
|
|
|
|
#define QSE_HASH_MORE_VSTR(hv, ptr, type) do { \
|
|
|
|
|
type* p = (type*)(ptr); \
|
|
|
|
|
while (*p) { hv = QSE_HASH_VALUE(hv, *p); p++; } \
|
|
|
|
|
#define QSE_HASH_MORE_VPTR(hv, ptr, type) do { \
|
|
|
|
|
type* __qse_hash_more_values_p = (type*)(ptr); \
|
|
|
|
|
while (*__qse_hash_more_values_p) \
|
|
|
|
|
{ \
|
|
|
|
|
hv = QSE_HASH_VALUE(hv, *__qse_hash_more_values_p); \
|
|
|
|
|
__qse_hash_more_values_p++; \
|
|
|
|
|
} \
|
|
|
|
|
} while(0)
|
|
|
|
|
|
|
|
|
|
#define QSE_HASH_BYTES(hv, ptr, len) QSE_HASH_VALUES(hv, ptr, len, const qse_uint8_t)
|
|
|
|
|
#define QSE_HASH_MORE_BYTES(hv, ptr, len) QSE_HASH_MORE_VALUES(hv, ptr, len, const qse_uint8_t)
|
|
|
|
|
#define QSE_HASH_BYTES(hv, ptr, len) QSE_HASH_VPTL(hv, ptr, len, const qse_uint8_t)
|
|
|
|
|
#define QSE_HASH_MORE_BYTES(hv, ptr, len) QSE_HASH_MORE_VPTL(hv, ptr, len, const qse_uint8_t)
|
|
|
|
|
|
|
|
|
|
#define QSE_HASH_MCHARS(hv, ptr, len) QSE_HASH_VALUES(hv, ptr, len, const qse_mchar_t)
|
|
|
|
|
#define QSE_HASH_MORE_MCHARS(hv, ptr, len) QSE_HASH_MORE_VALUES(hv, ptr, len, const qse_mchar_t)
|
|
|
|
|
#define QSE_HASH_MCHARS(hv, ptr, len) QSE_HASH_VPTL(hv, ptr, len, const qse_mchar_t)
|
|
|
|
|
#define QSE_HASH_MORE_MCHARS(hv, ptr, len) QSE_HASH_MORE_VPTL(hv, ptr, len, const qse_mchar_t)
|
|
|
|
|
|
|
|
|
|
#define QSE_HASH_WCHARS(hv, ptr, len) QSE_HASH_VALUES(hv, ptr, len, const qse_wchar_t)
|
|
|
|
|
#define QSE_HASH_MORE_WCHARS(hv, ptr, len) QSE_HASH_MORE_VALUES(hv, ptr, len, const qse_wchar_t)
|
|
|
|
|
#define QSE_HASH_WCHARS(hv, ptr, len) QSE_HASH_VPTL(hv, ptr, len, const qse_wchar_t)
|
|
|
|
|
#define QSE_HASH_MORE_WCHARS(hv, ptr, len) QSE_HASH_MORE_VPTL(hv, ptr, len, const qse_wchar_t)
|
|
|
|
|
|
|
|
|
|
#define QSE_HASH_MBS(hv, ptr) QSE_HASH_VSTR(hv, ptr, const qse_mchar_t)
|
|
|
|
|
#define QSE_HASH_MORE_MBS(hv, ptr) QSE_HASH_MORE_VSTR(hv, ptr, const qse_mchar_t)
|
|
|
|
|
#define QSE_HASH_MBS(hv, ptr) QSE_HASH_VPTR(hv, ptr, const qse_mchar_t)
|
|
|
|
|
#define QSE_HASH_MORE_MBS(hv, ptr) QSE_HASH_MORE_VPTR(hv, ptr, const qse_mchar_t)
|
|
|
|
|
|
|
|
|
|
#define QSE_HASH_WCS(hv, ptr) QSE_HASH_VSTR(hv, ptr, const qse_wchar_t)
|
|
|
|
|
#define QSE_HASH_MORE_WCS(hv, ptr) QSE_HASH_MORE_VSTR(hv, ptr, const qse_wchar_t)
|
|
|
|
|
#define QSE_HASH_WCS(hv, ptr) QSE_HASH_VPTR(hv, ptr, const qse_wchar_t)
|
|
|
|
|
#define QSE_HASH_MORE_WCS(hv, ptr) QSE_HASH_MORE_VPTR(hv, ptr, const qse_wchar_t)
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|