@@ -43,7 +43,7 @@ cfg_if! {
43
43
}
44
44
}
45
45
46
- pub ( crate ) type HashMap < K , V , S > = std :: collections :: HashMap < K , SharedValue < V > , S > ;
46
+ pub ( crate ) type HashMap < K , V , S > = hashbrown :: HashMap < K , SharedValue < V > , S > ;
47
47
48
48
fn default_shard_amount ( ) -> usize {
49
49
( num_cpus:: get ( ) * 4 ) . next_power_of_two ( )
@@ -271,14 +271,18 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: BuildHasher + Clone> DashMap<K, V, S> {
271
271
}
272
272
}
273
273
274
- /// Hash a given item to produce a usize.
275
- /// Uses the provided or default HashBuilder.
276
- pub fn hash_usize < T : Hash > ( & self , item : & T ) -> usize {
274
+ fn hash_u64 < T : Hash > ( & self , item : & T ) -> u64 {
277
275
let mut hasher = self . hasher . build_hasher ( ) ;
278
276
279
277
item. hash ( & mut hasher) ;
280
278
281
- hasher. finish ( ) as usize
279
+ hasher. finish ( )
280
+ }
281
+
282
+ /// Hash a given item to produce a usize.
283
+ /// Uses the provided or default HashBuilder.
284
+ pub fn hash_usize < T : Hash > ( & self , item : & T ) -> usize {
285
+ self . hash_u64 ( item) as usize
282
286
}
283
287
284
288
cfg_if ! {
@@ -329,8 +333,8 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: BuildHasher + Clone> DashMap<K, V, S> {
329
333
K : Borrow <Q >,
330
334
Q : Hash + Eq + ?Sized ,
331
335
{
332
- let hash = self . hash_usize ( & key) ;
333
- self . determine_shard( hash)
336
+ let hash = self . hash_u64 ( & key) ;
337
+ self . determine_shard( hash as usize )
334
338
}
335
339
}
336
340
}
@@ -837,50 +841,64 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> Map<'a, K, V, S>
837
841
}
838
842
839
843
fn _insert ( & self , key : K , value : V ) -> Option < V > {
840
- let hash = self . hash_usize ( & key) ;
844
+ let hash = self . hash_u64 ( & key) ;
841
845
842
- let idx = self . determine_shard ( hash) ;
846
+ let idx = self . determine_shard ( hash as usize ) ;
843
847
844
848
let mut shard = unsafe { self . _yield_write_shard ( idx) } ;
845
849
846
- shard
847
- . insert ( key, SharedValue :: new ( value) )
848
- . map ( |v| v. into_inner ( ) )
850
+ match shard. raw_entry_mut ( ) . from_key_hashed_nocheck ( hash, & key) {
851
+ hashbrown:: hash_map:: RawEntryMut :: Occupied ( mut occupied) => {
852
+ Some ( occupied. insert ( SharedValue :: new ( value) ) . into_inner ( ) )
853
+ }
854
+ hashbrown:: hash_map:: RawEntryMut :: Vacant ( vacant) => {
855
+ vacant. insert ( key, SharedValue :: new ( value) ) ;
856
+ None
857
+ }
858
+ }
849
859
}
850
860
851
861
fn _remove < Q > ( & self , key : & Q ) -> Option < ( K , V ) >
852
862
where
853
863
K : Borrow < Q > ,
854
864
Q : Hash + Eq + ?Sized ,
855
865
{
856
- let hash = self . hash_usize ( & key) ;
866
+ let hash = self . hash_u64 ( & key) ;
857
867
858
- let idx = self . determine_shard ( hash) ;
868
+ let idx = self . determine_shard ( hash as usize ) ;
859
869
860
870
let mut shard = unsafe { self . _yield_write_shard ( idx) } ;
861
871
862
- shard. remove_entry ( key) . map ( |( k, v) | ( k, v. into_inner ( ) ) )
872
+ match shard. raw_entry_mut ( ) . from_key_hashed_nocheck ( hash, key) {
873
+ hashbrown:: hash_map:: RawEntryMut :: Occupied ( entry) => {
874
+ let ( k, v) = entry. remove_entry ( ) ;
875
+ Some ( ( k, v. into_inner ( ) ) )
876
+ }
877
+ hashbrown:: hash_map:: RawEntryMut :: Vacant ( _) => None ,
878
+ }
863
879
}
864
880
865
881
fn _remove_if < Q > ( & self , key : & Q , f : impl FnOnce ( & K , & V ) -> bool ) -> Option < ( K , V ) >
866
882
where
867
883
K : Borrow < Q > ,
868
884
Q : Hash + Eq + ?Sized ,
869
885
{
870
- let hash = self . hash_usize ( & key) ;
886
+ let hash = self . hash_u64 ( & key) ;
871
887
872
- let idx = self . determine_shard ( hash) ;
888
+ let idx = self . determine_shard ( hash as usize ) ;
873
889
874
890
let mut shard = unsafe { self . _yield_write_shard ( idx) } ;
875
891
876
- if let Some ( ( k, v) ) = shard. get_key_value ( key) {
877
- if f ( k, v. get ( ) ) {
878
- shard. remove_entry ( key) . map ( |( k, v) | ( k, v. into_inner ( ) ) )
879
- } else {
880
- None
892
+ match shard. raw_entry_mut ( ) . from_key_hashed_nocheck ( hash, key) {
893
+ hashbrown:: hash_map:: RawEntryMut :: Occupied ( occupied) => {
894
+ if f ( & occupied. key ( ) , & occupied. get ( ) . get ( ) ) {
895
+ let ( k, v) = occupied. remove_entry ( ) ;
896
+ Some ( ( k, v. into_inner ( ) ) )
897
+ } else {
898
+ None
899
+ }
881
900
}
882
- } else {
883
- None
901
+ hashbrown:: hash_map:: RawEntryMut :: Vacant ( _) => None ,
884
902
}
885
903
}
886
904
@@ -889,25 +907,23 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> Map<'a, K, V, S>
889
907
K : Borrow < Q > ,
890
908
Q : Hash + Eq + ?Sized ,
891
909
{
892
- let hash = self . hash_usize ( & key) ;
910
+ let hash = self . hash_u64 ( & key) ;
893
911
894
- let idx = self . determine_shard ( hash) ;
912
+ let idx = self . determine_shard ( hash as usize ) ;
895
913
896
914
let mut shard = unsafe { self . _yield_write_shard ( idx) } ;
897
915
898
- if let Some ( ( kptr, vptr) ) = shard. get_key_value ( & key) {
899
- unsafe {
900
- let kptr: * const K = kptr;
901
- let vptr: * mut V = vptr. as_ptr ( ) ;
902
-
903
- if f ( & * kptr, & mut * vptr) {
904
- shard. remove_entry ( key) . map ( |( k, v) | ( k, v. into_inner ( ) ) )
916
+ match shard. raw_entry_mut ( ) . from_key_hashed_nocheck ( hash, key) {
917
+ hashbrown:: hash_map:: RawEntryMut :: Occupied ( mut occupied) => {
918
+ let ( k, v) = occupied. get_key_value_mut ( ) ;
919
+ if f ( k, v. get_mut ( ) ) {
920
+ let ( k, v) = occupied. remove_entry ( ) ;
921
+ Some ( ( k, v. into_inner ( ) ) )
905
922
} else {
906
923
None
907
924
}
908
925
}
909
- } else {
910
- None
926
+ hashbrown:: hash_map:: RawEntryMut :: Vacant ( _) => None ,
911
927
}
912
928
}
913
929
@@ -924,13 +940,13 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> Map<'a, K, V, S>
924
940
K : Borrow < Q > ,
925
941
Q : Hash + Eq + ?Sized ,
926
942
{
927
- let hash = self . hash_usize ( & key) ;
943
+ let hash = self . hash_u64 ( & key) ;
928
944
929
- let idx = self . determine_shard ( hash) ;
945
+ let idx = self . determine_shard ( hash as usize ) ;
930
946
931
947
let shard = unsafe { self . _yield_read_shard ( idx) } ;
932
948
933
- if let Some ( ( kptr, vptr) ) = shard. get_key_value ( key) {
949
+ if let Some ( ( kptr, vptr) ) = shard. raw_entry ( ) . from_key_hashed_nocheck ( hash , key) {
934
950
unsafe {
935
951
let kptr: * const K = kptr;
936
952
let vptr: * const V = vptr. get ( ) ;
@@ -946,13 +962,13 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> Map<'a, K, V, S>
946
962
K : Borrow < Q > ,
947
963
Q : Hash + Eq + ?Sized ,
948
964
{
949
- let hash = self . hash_usize ( & key) ;
965
+ let hash = self . hash_u64 ( & key) ;
950
966
951
- let idx = self . determine_shard ( hash) ;
967
+ let idx = self . determine_shard ( hash as usize ) ;
952
968
953
969
let shard = unsafe { self . _yield_write_shard ( idx) } ;
954
970
955
- if let Some ( ( kptr, vptr) ) = shard. get_key_value ( key) {
971
+ if let Some ( ( kptr, vptr) ) = shard. raw_entry ( ) . from_key_hashed_nocheck ( hash , key) {
956
972
unsafe {
957
973
let kptr: * const K = kptr;
958
974
let vptr: * mut V = vptr. as_ptr ( ) ;
@@ -968,16 +984,16 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> Map<'a, K, V, S>
968
984
K : Borrow < Q > ,
969
985
Q : Hash + Eq + ?Sized ,
970
986
{
971
- let hash = self . hash_usize ( & key) ;
987
+ let hash = self . hash_u64 ( & key) ;
972
988
973
- let idx = self . determine_shard ( hash) ;
989
+ let idx = self . determine_shard ( hash as usize ) ;
974
990
975
991
let shard = match unsafe { self . _try_yield_read_shard ( idx) } {
976
992
Some ( shard) => shard,
977
993
None => return TryResult :: Locked ,
978
994
} ;
979
995
980
- if let Some ( ( kptr, vptr) ) = shard. get_key_value ( key) {
996
+ if let Some ( ( kptr, vptr) ) = shard. raw_entry ( ) . from_key_hashed_nocheck ( hash , key) {
981
997
unsafe {
982
998
let kptr: * const K = kptr;
983
999
let vptr: * const V = vptr. get ( ) ;
@@ -993,16 +1009,16 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> Map<'a, K, V, S>
993
1009
K : Borrow < Q > ,
994
1010
Q : Hash + Eq + ?Sized ,
995
1011
{
996
- let hash = self . hash_usize ( & key) ;
1012
+ let hash = self . hash_u64 ( & key) ;
997
1013
998
- let idx = self . determine_shard ( hash) ;
1014
+ let idx = self . determine_shard ( hash as usize ) ;
999
1015
1000
1016
let shard = match unsafe { self . _try_yield_write_shard ( idx) } {
1001
1017
Some ( shard) => shard,
1002
1018
None => return TryResult :: Locked ,
1003
1019
} ;
1004
1020
1005
- if let Some ( ( kptr, vptr) ) = shard. get_key_value ( key) {
1021
+ if let Some ( ( kptr, vptr) ) = shard. raw_entry ( ) . from_key_hashed_nocheck ( hash , key) {
1006
1022
unsafe {
1007
1023
let kptr: * const K = kptr;
1008
1024
let vptr: * mut V = vptr. as_ptr ( ) ;
@@ -1061,13 +1077,13 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> Map<'a, K, V, S>
1061
1077
}
1062
1078
1063
1079
fn _entry ( & ' a self , key : K ) -> Entry < ' a , K , V , S > {
1064
- let hash = self . hash_usize ( & key) ;
1080
+ let hash = self . hash_u64 ( & key) ;
1065
1081
1066
- let idx = self . determine_shard ( hash) ;
1082
+ let idx = self . determine_shard ( hash as usize ) ;
1067
1083
1068
1084
let shard = unsafe { self . _yield_write_shard ( idx) } ;
1069
1085
1070
- if let Some ( ( kptr, vptr) ) = shard. get_key_value ( & key) {
1086
+ if let Some ( ( kptr, vptr) ) = shard. raw_entry ( ) . from_key_hashed_nocheck ( hash , & key) {
1071
1087
unsafe {
1072
1088
let kptr: * const K = kptr;
1073
1089
let vptr: * mut V = vptr. as_ptr ( ) ;
@@ -1079,16 +1095,16 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> Map<'a, K, V, S>
1079
1095
}
1080
1096
1081
1097
fn _try_entry ( & ' a self , key : K ) -> Option < Entry < ' a , K , V , S > > {
1082
- let hash = self . hash_usize ( & key) ;
1098
+ let hash = self . hash_u64 ( & key) ;
1083
1099
1084
- let idx = self . determine_shard ( hash) ;
1100
+ let idx = self . determine_shard ( hash as usize ) ;
1085
1101
1086
1102
let shard = match unsafe { self . _try_yield_write_shard ( idx) } {
1087
1103
Some ( shard) => shard,
1088
1104
None => return None ,
1089
1105
} ;
1090
1106
1091
- if let Some ( ( kptr, vptr) ) = shard. get_key_value ( & key) {
1107
+ if let Some ( ( kptr, vptr) ) = shard. raw_entry ( ) . from_key_hashed_nocheck ( hash , & key) {
1092
1108
unsafe {
1093
1109
let kptr: * const K = kptr;
1094
1110
let vptr: * mut V = vptr. as_ptr ( ) ;
0 commit comments