diff options
| author | boris <wzn@moneybot.cc> | 2018-12-05 14:25:59 +1300 |
|---|---|---|
| committer | boris <wzn@moneybot.cc> | 2018-12-05 14:25:59 +1300 |
| commit | 793965d3c2816fc1b672c9173b3b831d82cdec33 (patch) | |
| tree | f7e2b8b9f948f5816064d4dc265e91dd755ec7db /loader/server/fnv.hpp | |
| parent | bca49754578cd6c002fa258f89fe85bb9966e9c1 (diff) | |
server
Diffstat (limited to 'loader/server/fnv.hpp')
| -rw-r--r-- | loader/server/fnv.hpp | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/loader/server/fnv.hpp b/loader/server/fnv.hpp new file mode 100644 index 0000000..08a478b --- /dev/null +++ b/loader/server/fnv.hpp @@ -0,0 +1,64 @@ +#pragma once + +#pragma warning( disable : 4307 ) // '*': integral constant overflow +#pragma warning( disable : 4244 ) // possible loss of data + +#include <cstdint> +#include <string> + +using hash_t = unsigned int; + +// used for compile-time FNV-1a 32bit hashes. +#define fnv( str ) \ + [&]() { \ + constexpr hash_t out = hash::fnv1a( str ); \ + \ + return out; \ + }() + +// used for compile-time FNV-1a 32bit hashes when above macro cant be used for constexpr variables. +#define fnv_const( str ) Hash::fnv1a_32( str ) + +namespace hash // FNV-1a ( Fowler-Noll-Vo hash ). +{ + // FNV-1a constants. + enum : hash_t { + FNV1A_PRIME = 0x1000193, + FNV1A_BASIS = 0x811C9DC5 + }; + + // compile-time strlen. + __forceinline constexpr size_t ct_strlen( const char *str ) { + size_t out = 1; + + for( ; str[ out ] != '\0'; ++out ); + + return out; + } + + // hash data. + __forceinline constexpr hash_t fnv1a( const uint8_t *data, const size_t len ) { + hash_t out = FNV1A_BASIS; + + for( size_t i = 0; i < len; ++i ) + out = ( out ^ data[ i ] ) * FNV1A_PRIME; + + return out; + } + + // hash c-style string. + __forceinline constexpr hash_t fnv1a( const char *str ) { + hash_t out = FNV1A_BASIS; + size_t len = ct_strlen( str ); + + for( size_t i = 0; i < len; ++i ) + out = ( out ^ str[ i ] ) * FNV1A_PRIME; + + return out; + } + + // hash C++-style string ( runtime only ). + __forceinline hash_t fnv1a( const std::string &str ) { + return fnv1a( ( uint8_t* )str.c_str( ), str.length( ) ); + } +}
\ No newline at end of file |
