summaryrefslogtreecommitdiff
path: root/src/fnv.h
blob: 88d66cb84957200286a8b5b2489ba3d03f615bbd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//|_   _   _.     _  ._  |_   _.  _ |
//| | (/_ (_| \/ (/_ | | | | (_| (_ |<

#pragma once
#include "typedef.h"

typedef U32 FNV1A;

enum : FNV1A {
  FNV1A_PRIME = 0x1000193,
  FNV1A_BASIS = 0x811C9DC5
};

inline constexpr U32 strlen_ct( const char* str ) {
  U32 s = 0;
  for( ; !!str[s]; ++s );

  return s;
}

inline constexpr FNV1A fnv1a( const U8* data, const U32 size ) {
  FNV1A out = FNV1A_BASIS;

  for( U32 i = 0; i < size; ++i )
    out = ( out ^ data[i] ) * FNV1A_PRIME;

  return out;
}

inline constexpr FNV1A fnv1a( const char* str ) {
  U32 len = strlen_ct( str );

  return fnv1a( (const U8*)str, len );
}

#pragma warning( disable : 4455 )
constexpr FNV1A operator""fnv( const char* str, U32 len ) {
  return fnv1a( (const U8*)str, len );
}