@@ -78,21 +78,30 @@ function _hash_integer(
7878 seed ⊻= (x < 0 )
7979 u = abs (x)
8080
81- # always left-pad to multiple of 8 bytes
82- buflen = UInt (cld (top_set_bit (u), 64 ) * 8 )
81+ # always left-pad to full byte
82+ buflen = UInt (max ( cld (top_set_bit (u), 8 ), 1 ) )
8383 seed = seed ⊻ (hash_mix (seed ⊻ secret[1 ], secret[2 ]) ⊻ buflen)
8484
8585 a = zero (UInt64)
8686 b = zero (UInt64)
8787
8888 if buflen ≤ 16
89- a = (UInt64 (u % UInt32) << 32 ) |
90- UInt64 ((u >>> ((buflen - 4 ) * 8 )) % UInt32)
89+ if buflen ≥ 4
90+ a = (UInt64 (u % UInt32) << 32 ) |
91+ UInt64 ((u >>> ((buflen - 4 ) * 8 )) % UInt32)
9192
92- delta = (buflen & 24 ) >>> (buflen >>> 3 )
93+ delta = (buflen & 24 ) >>> (buflen >>> 3 )
9394
94- b = (UInt64 ((u >>> (8 * delta)) % UInt32) << 32 ) |
95- UInt64 ((u >>> (8 * (buflen - 4 - delta))) % UInt32)
95+ b = (UInt64 ((u >>> (8 * delta)) % UInt32) << 32 ) |
96+ UInt64 ((u >>> (8 * (buflen - 4 - delta))) % UInt32)
97+ else # buflen > 0
98+ b0 = u % UInt8
99+ b1 = (u >>> (8 * div (buflen, 2 ))) % UInt8
100+ b2 = (u >>> (8 * (buflen - 1 ))) % UInt8
101+ a = (UInt64 (b0) << 56 ) |
102+ (UInt64 (b1) << 32 ) |
103+ UInt64 (b2)
104+ end
96105 else
97106 a = (u >>> 8 (buflen - 16 )) % UInt
98107 b = (u >>> 8 (buflen - 8 )) % UInt
@@ -112,9 +121,9 @@ function _hash_integer(
112121 seed = hash_mix (l0 ⊻ secret[1 ], l1 ⊻ seed)
113122 see1 = hash_mix (l2 ⊻ secret[2 ], l3 ⊻ see1)
114123 see2 = hash_mix (l4 ⊻ secret[3 ], l5 ⊻ see2)
124+ i -= 48
115125 end
116126 seed = seed ⊻ see1 ⊻ see2
117- i -= 48
118127 end
119128 if i > 16
120129 l0 = u % UInt; u >>>= 64
0 commit comments