@@ -556,20 +556,19 @@ public uint HashCore(uint seed, uint mask, in VBuffer<float> values)
556
556
return 0 ;
557
557
hash = Hashing . MurmurRound ( hash , FloatUtils . GetBits ( value == 0 ? 0 : value ) ) ;
558
558
}
559
- return ( Hashing . MixHash ( hash , sizeof ( uint ) ) & mask ) + 1 ;
559
+ return ( Hashing . MixHash ( hash , values . Length * sizeof ( uint ) ) & mask ) + 1 ;
560
560
}
561
561
}
562
562
563
563
private readonly struct HashDouble : IHasher < double >
564
564
{
565
565
[ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
566
-
567
566
public uint HashCoreOld ( uint seed , uint mask , in double value )
568
567
{
569
568
if ( double . IsNaN ( value ) )
570
569
return 0 ;
571
570
572
- return ( Hashing . MixHash ( HashRound ( seed , value ) ) & mask ) + 1 ;
571
+ return ( Hashing . MixHash ( HashRound ( seed , value , true ) ) & mask ) + 1 ;
573
572
}
574
573
575
574
[ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
@@ -578,7 +577,7 @@ public uint HashCore(uint seed, uint mask, in double value)
578
577
if ( double . IsNaN ( value ) )
579
578
return 0 ;
580
579
581
- return ( Hashing . MixHash ( HashRound ( seed , value ) , sizeof ( double ) ) & mask ) + 1 ;
580
+ return ( Hashing . MixHash ( HashRound ( seed , value , false ) , sizeof ( double ) ) & mask ) + 1 ;
582
581
}
583
582
584
583
[ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
@@ -589,17 +588,19 @@ public uint HashCore(uint seed, uint mask, in VBuffer<double> values)
589
588
{
590
589
if ( double . IsNaN ( value ) )
591
590
return 0 ;
592
- hash = HashRound ( hash , value ) ;
591
+ hash = HashRound ( hash , value , false ) ;
593
592
}
594
- return ( Hashing . MixHash ( hash , sizeof ( uint ) ) & mask ) + 1 ;
593
+ return ( Hashing . MixHash ( hash , values . Length * sizeof ( double ) ) & mask ) + 1 ;
595
594
}
596
595
597
596
[ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
598
- private uint HashRound ( uint seed , double value )
597
+ private uint HashRound ( uint seed , double value , bool old )
599
598
{
600
599
ulong v = FloatUtils . GetBits ( value == 0 ? 0 : value ) ;
601
600
var hash = Hashing . MurmurRound ( seed , Utils . GetLo ( v ) ) ;
602
601
var hi = Utils . GetHi ( v ) ;
602
+ if ( old && hi == 0 )
603
+ return hash ;
603
604
return Hashing . MurmurRound ( hash , hi ) ;
604
605
}
605
606
}
@@ -648,7 +649,7 @@ public uint HashCore(uint seed, uint mask, in VBuffer<byte> values)
648
649
return 0 ;
649
650
hash = Hashing . MurmurRound ( hash , value ) ;
650
651
}
651
- return ( Hashing . MixHash ( hash , sizeof ( uint ) ) & mask ) + 1 ;
652
+ return ( Hashing . MixHash ( hash , values . Length * sizeof ( uint ) ) & mask ) + 1 ;
652
653
}
653
654
}
654
655
@@ -672,7 +673,7 @@ public uint HashCore(uint seed, uint mask, in VBuffer<ushort> values)
672
673
return 0 ;
673
674
hash = Hashing . MurmurRound ( hash , value ) ;
674
675
}
675
- return ( Hashing . MixHash ( hash , sizeof ( uint ) ) & mask ) + 1 ;
676
+ return ( Hashing . MixHash ( hash , values . Length * sizeof ( uint ) ) & mask ) + 1 ;
676
677
}
677
678
}
678
679
@@ -696,7 +697,7 @@ public uint HashCore(uint seed, uint mask, in VBuffer<uint> values)
696
697
return 0 ;
697
698
hash = Hashing . MurmurRound ( hash , value ) ;
698
699
}
699
- return ( Hashing . MixHash ( hash , sizeof ( uint ) ) & mask ) + 1 ;
700
+ return ( Hashing . MixHash ( hash , values . Length * sizeof ( uint ) ) & mask ) + 1 ;
700
701
}
701
702
}
702
703
@@ -707,15 +708,15 @@ public uint HashCoreOld(uint seed, uint mask, in ulong value)
707
708
{
708
709
if ( value == 0 )
709
710
return 0 ;
710
- return ( Hashing . MixHash ( HashRound ( seed , value ) ) & mask ) + 1 ;
711
+ return ( Hashing . MixHash ( HashRound ( seed , value , true ) ) & mask ) + 1 ;
711
712
}
712
713
713
714
[ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
714
715
public uint HashCore ( uint seed , uint mask , in ulong value )
715
716
{
716
717
if ( value == 0 )
717
718
return 0 ;
718
- return ( Hashing . MixHash ( HashRound ( seed , value ) , sizeof ( uint ) ) & mask ) + 1 ;
719
+ return ( Hashing . MixHash ( HashRound ( seed , value , false ) , sizeof ( ulong ) ) & mask ) + 1 ;
719
720
}
720
721
721
722
[ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
@@ -726,17 +727,17 @@ public uint HashCore(uint seed, uint mask, in VBuffer<ulong> values)
726
727
{
727
728
if ( value == 0 )
728
729
return 0 ;
729
- hash = HashRound ( hash , value ) ;
730
+ hash = HashRound ( hash , value , false ) ;
730
731
}
731
- return ( Hashing . MixHash ( hash , sizeof ( uint ) ) & mask ) + 1 ;
732
+ return ( Hashing . MixHash ( hash , values . Length * sizeof ( ulong ) ) & mask ) + 1 ;
732
733
}
733
734
734
735
[ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
735
- private uint HashRound ( uint seed , ulong value )
736
+ private uint HashRound ( uint seed , ulong value , bool old )
736
737
{
737
738
var hash = Hashing . MurmurRound ( seed , Utils . GetLo ( value ) ) ;
738
739
var hi = Utils . GetHi ( value ) ;
739
- if ( hi == 0 )
740
+ if ( old && hi == 0 )
740
741
return hash ;
741
742
return Hashing . MurmurRound ( hash , hi ) ;
742
743
}
@@ -758,7 +759,7 @@ public uint HashCore(uint seed, uint mask, in VBuffer<byte> values)
758
759
var hash = seed ;
759
760
foreach ( var value in values . DenseValues ( ) )
760
761
hash = Hashing . MurmurRound ( hash , value ) ;
761
- return ( Hashing . MixHash ( hash , sizeof ( uint ) ) & mask ) + 1 ;
762
+ return ( Hashing . MixHash ( hash , values . Length * sizeof ( uint ) ) & mask ) + 1 ;
762
763
}
763
764
}
764
765
@@ -778,7 +779,7 @@ public uint HashCore(uint seed, uint mask, in VBuffer<ushort> values)
778
779
var hash = seed ;
779
780
foreach ( var value in values . DenseValues ( ) )
780
781
hash = Hashing . MurmurRound ( hash , value ) ;
781
- return ( Hashing . MixHash ( hash , sizeof ( uint ) ) & mask ) + 1 ;
782
+ return ( Hashing . MixHash ( hash , values . Length * sizeof ( uint ) ) & mask ) + 1 ;
782
783
}
783
784
}
784
785
@@ -798,7 +799,7 @@ public uint HashCore(uint seed, uint mask, in VBuffer<uint> values)
798
799
var hash = seed ;
799
800
foreach ( var value in values . DenseValues ( ) )
800
801
hash = Hashing . MurmurRound ( hash , value ) ;
801
- return ( Hashing . MixHash ( hash , sizeof ( uint ) ) & mask ) + 1 ;
802
+ return ( Hashing . MixHash ( hash , values . Length * sizeof ( uint ) ) & mask ) + 1 ;
802
803
}
803
804
}
804
805
@@ -807,29 +808,31 @@ public uint HashCore(uint seed, uint mask, in VBuffer<uint> values)
807
808
[ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
808
809
public uint HashCoreOld ( uint seed , uint mask , in ulong value )
809
810
{
810
- return ( Hashing . MixHash ( HashRound ( seed , value ) ) & mask ) + 1 ;
811
+ return ( Hashing . MixHash ( HashRound ( seed , value , true ) ) & mask ) + 1 ;
811
812
}
812
813
813
814
[ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
814
815
public uint HashCore ( uint seed , uint mask , in ulong value )
815
816
{
816
- return ( Hashing . MixHash ( HashRound ( seed , value ) , sizeof ( ulong ) ) & mask ) + 1 ;
817
+ return ( Hashing . MixHash ( HashRound ( seed , value , false ) , sizeof ( ulong ) ) & mask ) + 1 ;
817
818
}
818
819
819
820
[ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
820
821
public uint HashCore ( uint seed , uint mask , in VBuffer < ulong > values )
821
822
{
822
823
var hash = seed ;
823
824
foreach ( var value in values . DenseValues ( ) )
824
- hash = HashRound ( hash , value ) ;
825
- return ( Hashing . MixHash ( hash , sizeof ( uint ) ) & mask ) + 1 ;
825
+ hash = HashRound ( hash , value , false ) ;
826
+ return ( Hashing . MixHash ( hash , values . Length * sizeof ( ulong ) ) & mask ) + 1 ;
826
827
}
827
828
828
829
[ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
829
- private uint HashRound ( uint seed , ulong value )
830
+ private uint HashRound ( uint seed , ulong value , bool old )
830
831
{
831
832
var hash = Hashing . MurmurRound ( seed , Utils . GetLo ( value ) ) ;
832
833
var hi = Utils . GetHi ( value ) ;
834
+ if ( old && hi == 0 )
835
+ return hash ;
833
836
return Hashing . MurmurRound ( hash , hi ) ;
834
837
}
835
838
}
@@ -839,32 +842,32 @@ private uint HashRound(uint seed, ulong value)
839
842
[ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
840
843
public uint HashCoreOld ( uint seed , uint mask , in DataViewRowId value )
841
844
{
842
- return ( Hashing . MixHash ( HashRound ( seed , value ) ) & mask ) + 1 ;
845
+ return ( Hashing . MixHash ( HashRound ( seed , value , true ) ) & mask ) + 1 ;
843
846
}
844
847
845
848
[ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
846
849
public uint HashCore ( uint seed , uint mask , in DataViewRowId value )
847
850
{
848
- return ( Hashing . MixHash ( HashRound ( seed , value ) , sizeof ( uint ) ) & mask ) + 1 ;
851
+ return ( Hashing . MixHash ( HashRound ( seed , value , false ) , 2 * sizeof ( ulong ) ) & mask ) + 1 ;
849
852
}
850
853
851
854
[ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
852
855
public uint HashCore ( uint seed , uint mask , in VBuffer < DataViewRowId > values )
853
856
{
854
857
var hash = seed ;
855
858
foreach ( var value in values . DenseValues ( ) )
856
- hash = HashRound ( hash , value ) ;
857
- return ( Hashing . MixHash ( hash , sizeof ( uint ) ) & mask ) + 1 ;
859
+ hash = HashRound ( hash , value , false ) ;
860
+ return ( Hashing . MixHash ( hash , values . Length * sizeof ( uint ) ) & mask ) + 1 ;
858
861
}
859
862
860
863
[ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
861
- private uint HashRound ( uint seed , DataViewRowId value )
864
+ private uint HashRound ( uint seed , DataViewRowId value , bool old )
862
865
{
863
866
var hash = Hashing . MurmurRound ( seed , Utils . GetLo ( value . Low ) ) ;
864
867
var hi = Utils . GetHi ( value . Low ) ;
865
- if ( hi != 0 )
868
+ if ( old && hi != 0 )
866
869
hash = Hashing . MurmurRound ( hash , hi ) ;
867
- if ( value . High != 0 )
870
+ if ( old && value . High != 0 )
868
871
{
869
872
hash = Hashing . MurmurRound ( hash , Utils . GetLo ( value . High ) ) ;
870
873
hi = Utils . GetHi ( value . High ) ;
@@ -891,7 +894,7 @@ public uint HashCore(uint seed, uint mask, in VBuffer<bool> values)
891
894
var hash = seed ;
892
895
foreach ( var value in values . DenseValues ( ) )
893
896
hash = Hashing . MurmurRound ( hash , value ? 1u : 0u ) ;
894
- return ( Hashing . MixHash ( hash , sizeof ( uint ) ) & mask ) + 1 ;
897
+ return ( Hashing . MixHash ( hash , values . Length * sizeof ( uint ) ) & mask ) + 1 ;
895
898
}
896
899
}
897
900
@@ -911,7 +914,7 @@ public uint HashCore(uint seed, uint mask, in VBuffer<sbyte> values)
911
914
var hash = seed ;
912
915
foreach ( var value in values . DenseValues ( ) )
913
916
hash = Hashing . MurmurRound ( hash , ( uint ) value ) ;
914
- return ( Hashing . MixHash ( hash , sizeof ( uint ) ) & mask ) + 1 ;
917
+ return ( Hashing . MixHash ( hash , values . Length * sizeof ( uint ) ) & mask ) + 1 ;
915
918
}
916
919
}
917
920
@@ -931,7 +934,7 @@ public uint HashCore(uint seed, uint mask, in VBuffer<short> values)
931
934
var hash = seed ;
932
935
foreach ( var value in values . DenseValues ( ) )
933
936
hash = Hashing . MurmurRound ( hash , ( uint ) value ) ;
934
- return ( Hashing . MixHash ( hash , sizeof ( uint ) ) & mask ) + 1 ;
937
+ return ( Hashing . MixHash ( hash , values . Length * sizeof ( uint ) ) & mask ) + 1 ;
935
938
}
936
939
}
937
940
@@ -951,7 +954,7 @@ public uint HashCore(uint seed, uint mask, in VBuffer<int> values)
951
954
var hash = seed ;
952
955
foreach ( var value in values . DenseValues ( ) )
953
956
hash = Hashing . MurmurRound ( hash , ( uint ) value ) ;
954
- return ( Hashing . MixHash ( hash , sizeof ( uint ) ) & mask ) + 1 ;
957
+ return ( Hashing . MixHash ( hash , values . Length * sizeof ( uint ) ) & mask ) + 1 ;
955
958
}
956
959
}
957
960
@@ -960,29 +963,31 @@ public uint HashCore(uint seed, uint mask, in VBuffer<int> values)
960
963
[ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
961
964
public uint HashCoreOld ( uint seed , uint mask , in long value )
962
965
{
963
- return ( Hashing . MixHash ( HashRound ( seed , value ) ) & mask ) + 1 ;
966
+ return ( Hashing . MixHash ( HashRound ( seed , value , true ) ) & mask ) + 1 ;
964
967
}
965
968
966
969
[ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
967
970
public uint HashCore ( uint seed , uint mask , in long value )
968
971
{
969
- return ( Hashing . MixHash ( HashRound ( seed , value ) , sizeof ( long ) ) & mask ) + 1 ;
972
+ return ( Hashing . MixHash ( HashRound ( seed , value , false ) , sizeof ( long ) ) & mask ) + 1 ;
970
973
}
971
974
972
975
[ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
973
976
public uint HashCore ( uint seed , uint mask , in VBuffer < long > values )
974
977
{
975
978
var hash = seed ;
976
979
foreach ( var value in values . DenseValues ( ) )
977
- hash = HashRound ( hash , value ) ;
978
- return ( Hashing . MixHash ( hash , sizeof ( uint ) ) & mask ) + 1 ;
980
+ hash = HashRound ( hash , value , false ) ;
981
+ return ( Hashing . MixHash ( hash , values . Length * sizeof ( long ) ) & mask ) + 1 ;
979
982
}
980
983
981
984
[ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
982
- private uint HashRound ( uint seed , long value )
985
+ private uint HashRound ( uint seed , long value , bool old )
983
986
{
984
987
var hash = Hashing . MurmurRound ( seed , Utils . GetLo ( ( ulong ) value ) ) ;
985
988
var hi = Utils . GetHi ( ( ulong ) value ) ;
989
+ if ( old && hi == 0 )
990
+ return hash ;
986
991
return Hashing . MurmurRound ( hash , hi ) ;
987
992
}
988
993
}
0 commit comments