1212// See the License for the specific language governing permissions and
1313// limitations under the License.
1414
15- use std:: collections:: hash_map:: DefaultHasher ;
1615use std:: hash:: Hash ;
1716use std:: hash:: Hasher ;
1817
@@ -48,6 +47,7 @@ use md5::Digest;
4847use md5:: Md5 as Md5Hasher ;
4948use naive_cityhash:: cityhash64_with_seed;
5049use num_traits:: AsPrimitive ;
50+ use siphasher:: sip:: SipHasher13 ;
5151use twox_hash:: XxHash32 ;
5252use twox_hash:: XxHash64 ;
5353
@@ -70,7 +70,7 @@ pub fn register(registry: &mut FunctionRegistry) {
7070 NumberClass :: Decimal128 => {
7171 struct Siphash64 ;
7272 impl HashFunction for Siphash64 {
73- type Hasher = DefaultHasher ;
73+ type Hasher = SipHasher13 ;
7474 fn name( ) -> & ' static str {
7575 "siphash64"
7676 }
@@ -115,9 +115,7 @@ pub fn register(registry: &mut FunctionRegistry) {
115115 GenericType < 0 > ,
116116 NumberType < u64 > ,
117117 > ( |val, output, _| {
118- let mut hasher = DefaultHasher :: default ( ) ;
119- DFHash :: hash ( & val. to_owned ( ) , & mut hasher) ;
120- output. push ( hasher. finish ( ) ) ;
118+ output. push ( siphash64 ( & val. to_owned ( ) ) ) ;
121119 } ) )
122120 . register ( ) ;
123121
@@ -231,7 +229,7 @@ fn register_bucket(registry: &mut FunctionRegistry) {
231229 |_, _, _| FunctionDomain :: MayThrow ,
232230 vectorize_with_builder_2_arg :: < NumberType < u64 > , StringType , NumberType < i32 > > (
233231 |buckets, value, output, ctx| {
234- output. push ( bucket ( buckets, value. as_bytes ( ) , output. len ( ) , ctx) ) ;
232+ output. push ( bucket ( buckets, value, output. len ( ) , ctx) ) ;
235233 } ,
236234 ) ,
237235 ) ;
@@ -241,7 +239,7 @@ fn register_bucket(registry: &mut FunctionRegistry) {
241239 |_, _, _| FunctionDomain :: MayThrow ,
242240 vectorize_with_builder_2_arg :: < NumberType < u64 > , DateType , NumberType < i32 > > (
243241 |buckets, value, output, ctx| {
244- output. push ( bucket ( buckets, & value. to_le_bytes ( ) , output. len ( ) , ctx) ) ;
242+ output. push ( bucket ( buckets, & value, output. len ( ) , ctx) ) ;
245243 } ,
246244 ) ,
247245 ) ;
@@ -256,12 +254,7 @@ fn register_bucket(registry: &mut FunctionRegistry) {
256254 |_, _, _| FunctionDomain :: MayThrow ,
257255 vectorize_with_builder_2_arg :: < NumberType < u64 > , TimestampType , NumberType < i32 > > (
258256 |buckets, value, output, ctx| {
259- output. push ( bucket (
260- buckets,
261- & value. to_le_bytes ( ) ,
262- output. len ( ) ,
263- ctx,
264- ) ) ;
257+ output. push ( bucket ( buckets, & value, output. len ( ) , ctx) ) ;
265258 } ,
266259 ) ,
267260 ) ;
@@ -282,13 +275,7 @@ fn register_bucket(registry: &mut FunctionRegistry) {
282275 NumberType <NUM_TYPE >,
283276 NumberType <i32 >,
284277 >( |buckets, value, output, ctx| {
285- let value: i64 = value. as_( ) ;
286- output. push( bucket(
287- buckets,
288- & value. to_le_bytes( ) ,
289- output. len( ) ,
290- ctx,
291- ) ) ;
278+ output. push( bucket( buckets, & value, output. len( ) , ctx) ) ;
292279 } ) ,
293280 ) ;
294281 }
@@ -297,9 +284,9 @@ fn register_bucket(registry: &mut FunctionRegistry) {
297284 }
298285}
299286
300- fn bucket (
287+ fn bucket < T : DFHash + ? Sized > (
301288 buckets : u64 ,
302- bytes : & [ u8 ] ,
289+ value : & T ,
303290 row : usize ,
304291 ctx : & mut databend_common_expression:: EvalContext ,
305292) -> i32 {
@@ -312,9 +299,14 @@ fn bucket(
312299 return 0 ;
313300 }
314301
315- let mut bytes = bytes;
316- let hash = murmur3:: murmur3_32 ( & mut bytes, 0 ) . unwrap ( ) as i32 ;
317- ( hash & i32:: MAX ) % buckets
302+ ( siphash64 ( value) % buckets as u64 ) as i32
303+ }
304+
305+ fn siphash64 < T : DFHash + ?Sized > ( value : & T ) -> u64 {
306+ // Keep SQL hash results independent of Rust's unspecified DefaultHasher.
307+ let mut hasher = SipHasher13 :: new_with_keys ( 0 , 0 ) ;
308+ DFHash :: hash ( value, & mut hasher) ;
309+ hasher. finish ( )
318310}
319311
320312fn register_simple_domain_type_hash < T : ArgType > ( registry : & mut FunctionRegistry )
@@ -327,9 +319,7 @@ where for<'a> T::ScalarRef<'a>: DFHash {
327319 . calc_domain ( |_, _| FunctionDomain :: Full )
328320 . vectorized ( vectorize_with_builder_1_arg :: < T , NumberType < u64 > > (
329321 |val, output, _| {
330- let mut hasher = DefaultHasher :: default ( ) ;
331- DFHash :: hash ( & val, & mut hasher) ;
332- output. push ( hasher. finish ( ) ) ;
322+ output. push ( siphash64 ( & val) ) ;
333323 } ,
334324 ) )
335325 . register ( ) ;
0 commit comments