template constexpr auto hash_ex( const T* buf, BOOL upper ) { ULONG hash = 0x811C9DC5; while ( *buf ) { auto chr = static_cast( *buf++ ); if ( upper ) { // // uppercase // if ( chr >= 'a' && chr <= 'z' ) { chr -= 32; } } hash ^= chr; hash *= 0x01000193; } return hash; } template constexpr auto hash( const T* buf ) { return hash_ex( buf, TRUE ); }