1
- // @ts -ignore: decorator
2
- @inline
3
1
export function HASH < T > ( key : T ) : u64 {
4
2
if ( isString < T > ( ) ) {
5
3
return hashStr ( changetype < string > ( key ) ) ;
@@ -10,7 +8,7 @@ export function HASH<T>(key: T): u64 {
10
8
if ( sizeof < T > ( ) == 4 ) return hash32 ( reinterpret < u32 > ( f32 ( key ) ) ) ;
11
9
if ( sizeof < T > ( ) == 8 ) return hash64 ( reinterpret < u64 > ( f64 ( key ) ) ) ;
12
10
} else {
13
- if ( sizeof < T > ( ) <= 4 ) return hash32 ( u32 ( key ) ) ;
11
+ if ( sizeof < T > ( ) <= 4 ) return hash32 ( u32 ( key ) , sizeof < T > ( ) ) ;
14
12
if ( sizeof < T > ( ) == 8 ) return hash64 ( u64 ( key ) ) ;
15
13
}
16
14
return unreachable ( ) ;
@@ -32,8 +30,10 @@ export function HASH<T>(key: T): u64 {
32
30
// @ts -ignore: decorator
33
31
@inline const XXH64_SEED : u64 = 0 ;
34
32
35
- function hash32 ( key : u32 ) : u64 {
36
- var h : u64 = XXH64_SEED + XXH64_P5 + 4 ;
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
37
h ^= u64 ( key ) * XXH64_P1 ;
38
38
h = rotl ( h , 23 ) * XXH64_P2 + XXH64_P3 ;
39
39
h ^= h >> 33 ;
@@ -44,6 +44,8 @@ function hash32(key: u32): u64 {
44
44
return h ;
45
45
}
46
46
47
+ // @ts -ignore: decorator
48
+ @inline
47
49
function hash64 ( key : u64 ) : u64 {
48
50
var h : u64 = XXH64_SEED + XXH64_P5 + 8 ;
49
51
h ^= rotl ( key * XXH64_P2 , 31 ) * XXH64_P1 ;
@@ -68,6 +70,8 @@ function mix2(h: u64, s: u64): u64 {
68
70
return ( h ^ ( rotl ( s , 31 ) * XXH64_P1 ) ) * XXH64_P1 + XXH64_P4 ;
69
71
}
70
72
73
+ // @ts -ignore: decorator
74
+ @inline
71
75
function hashStr ( key : string ) : u64 {
72
76
if ( key === null ) {
73
77
return XXH64_SEED ;
@@ -80,6 +84,7 @@ function hashStr(key: string): u64 {
80
84
let s2 = XXH64_SEED + XXH64_P2 ;
81
85
let s3 = XXH64_SEED ;
82
86
let s4 = XXH64_SEED - XXH64_P1 ;
87
+ let ln = len ;
83
88
84
89
let i = 0 ;
85
90
len -= 32 ;
@@ -102,11 +107,11 @@ function hashStr(key: string): u64 {
102
107
h = mix2 ( h , s2 ) ;
103
108
h = mix2 ( h , s3 ) ;
104
109
h = mix2 ( h , s4 ) ;
110
+ h += < u64 > ln ;
105
111
106
- h += u64 ( len ) ;
107
112
len -= i ;
108
113
} else {
109
- h = u64 ( len ) + XXH64_SEED + XXH64_P5 ;
114
+ h = < u64 > len + XXH64_SEED + XXH64_P5 ;
110
115
}
111
116
112
117
var i = 0 ;
0 commit comments