1
+ // @ts -ignore: decorator
2
+ @inline
1
3
export function HASH < T > ( key : T ) : u64 {
2
4
if ( isString < T > ( ) ) {
3
5
return hashStr ( changetype < string > ( key ) ) ;
@@ -8,7 +10,9 @@ export function HASH<T>(key: T): u64 {
8
10
if ( sizeof < T > ( ) == 4 ) return hash32 ( reinterpret < u32 > ( f32 ( key ) ) ) ;
9
11
if ( sizeof < T > ( ) == 8 ) return hash64 ( reinterpret < u64 > ( f64 ( key ) ) ) ;
10
12
} else {
11
- if ( sizeof < T > ( ) <= 4 ) return hash32 ( u32 ( key ) , sizeof < T > ( ) ) ;
13
+ if ( sizeof < T > ( ) == 1 ) return hash8 ( u64 ( key ) ) ;
14
+ if ( sizeof < T > ( ) == 2 ) return hash16 ( u64 ( key ) ) ;
15
+ if ( sizeof < T > ( ) == 4 ) return hash32 ( u64 ( key ) ) ;
12
16
if ( sizeof < T > ( ) == 8 ) return hash64 ( u64 ( key ) ) ;
13
17
}
14
18
return unreachable ( ) ;
@@ -30,11 +34,33 @@ export function HASH<T>(key: T): u64 {
30
34
// @ts -ignore: decorator
31
35
@inline const XXH64_SEED : u64 = 0 ;
32
36
33
- // @ts -ignore: decorator
34
- @inline
35
- function hash32 ( key : u32 , len : u64 = 4 ) : u64 {
36
- var h : u64 = XXH64_SEED + XXH64_P5 + len ;
37
- h ^= u64 ( key ) * XXH64_P1 ;
37
+ function hash8 ( key : u64 ) : u64 {
38
+ var h : u64 = XXH64_SEED + XXH64_P5 + 1 ;
39
+ h ^= key * XXH64_P1 ;
40
+ h = rotl ( h , 23 ) * XXH64_P2 + XXH64_P3 ;
41
+ h ^= h >> 33 ;
42
+ h *= XXH64_P2 ;
43
+ h ^= h >> 29 ;
44
+ h *= XXH64_P3 ;
45
+ h ^= h >> 32 ;
46
+ return h ;
47
+ }
48
+
49
+ function hash16 ( key : u64 ) : u64 {
50
+ var h : u64 = XXH64_SEED + XXH64_P5 + 2 ;
51
+ h ^= key * XXH64_P1 ;
52
+ h = rotl ( h , 23 ) * XXH64_P2 + XXH64_P3 ;
53
+ h ^= h >> 33 ;
54
+ h *= XXH64_P2 ;
55
+ h ^= h >> 29 ;
56
+ h *= XXH64_P3 ;
57
+ h ^= h >> 32 ;
58
+ return h ;
59
+ }
60
+
61
+ function hash32 ( key : u64 ) : u64 {
62
+ var h : u64 = XXH64_SEED + XXH64_P5 + 4 ;
63
+ h ^= key * XXH64_P1 ;
38
64
h = rotl ( h , 23 ) * XXH64_P2 + XXH64_P3 ;
39
65
h ^= h >> 33 ;
40
66
h *= XXH64_P2 ;
@@ -44,8 +70,6 @@ function hash32(key: u32, len: u64 = 4): u64 {
44
70
return h ;
45
71
}
46
72
47
- // @ts -ignore: decorator
48
- @inline
49
73
function hash64 ( key : u64 ) : u64 {
50
74
var h : u64 = XXH64_SEED + XXH64_P5 + 8 ;
51
75
h ^= rotl ( key * XXH64_P2 , 31 ) * XXH64_P1 ;
@@ -70,8 +94,6 @@ function mix2(h: u64, s: u64): u64 {
70
94
return ( h ^ ( rotl ( s , 31 ) * XXH64_P1 ) ) * XXH64_P1 + XXH64_P4 ;
71
95
}
72
96
73
- // @ts -ignore: decorator
74
- @inline
75
97
function hashStr ( key : string ) : u64 {
76
98
if ( key === null ) {
77
99
return XXH64_SEED ;
0 commit comments