diff --git a/twml/libtwml/include/twml/utilities.h b/twml/libtwml/include/twml/utilities.h index a30b44aff..960d6625d 100644 --- a/twml/libtwml/include/twml/utilities.h +++ b/twml/libtwml/include/twml/utilities.h @@ -1,18 +1,21 @@ #pragma once -#ifdef __cplusplus + +#include +#include + namespace twml { -inline int64_t mixDiscreteIdAndValue(int64_t key, int64_t value) { - key ^= ((17LL + value) * 2654435761LL); - return key; -} + inline int64_t mixDiscreteIdAndValue(int64_t key, int64_t value) { + key ^= ((17LL + value) * 2654435761LL); + return key; + } -inline int64_t mixStringIdAndValue(int64_t key, int32_t str_len, const uint8_t *str) { - int32_t hash = 0; - for (int32_t i = 0; i < str_len; i++) { - hash = (31 * hash) + (int32_t)str[i]; - } - return key ^ hash; -} -} -#endif \ No newline at end of file + inline int64_t mixStringIdAndValue(int64_t key, int32_t str_len, const uint8_t* str) { + const uint8_t* end = str + str_len; + while (str != end) { + key = (key * 31) + *str++; + } + return key; + } + +} // namespace twml