@@ -697,8 +697,9 @@ where
697
697
/// assert_eq!(map.values_len(), 2);
698
698
/// ```
699
699
pub fn append ( & mut self , key : Key , value : Value ) -> bool {
700
- let hash = self . build_hasher . hash_one ( & key) ;
700
+ let hash = hash_key ( & self . build_hasher , & key) ;
701
701
let entry = raw_entry_mut ( & self . keys , & mut self . map , hash, & key) ;
702
+ let build_hasher = & self . build_hasher ;
702
703
703
704
match entry {
704
705
RawEntryMut :: Occupied ( mut entry) => {
@@ -722,7 +723,7 @@ where
722
723
let keys = & self . keys ;
723
724
let _ = entry. insert_with_hasher ( hash, key_index, MapEntry :: new ( index) , |& key_index| {
724
725
let key = keys. get ( key_index) . unwrap ( ) ;
725
- self . build_hasher . hash_one ( key)
726
+ hash_key ( build_hasher , key)
726
727
} ) ;
727
728
false
728
729
}
@@ -749,7 +750,7 @@ where
749
750
Key : Borrow < KeyQuery > ,
750
751
KeyQuery : ?Sized + Eq + Hash ,
751
752
{
752
- let hash = self . build_hasher . hash_one ( key) ;
753
+ let hash = hash_key ( & self . build_hasher , & key) ;
753
754
raw_entry ( & self . keys , & self . map , hash, key) . is_some ( )
754
755
}
755
756
@@ -769,7 +770,7 @@ where
769
770
/// ```
770
771
#[ must_use]
771
772
pub fn entry ( & mut self , key : Key ) -> Entry < ' _ , Key , Value , State > {
772
- let hash = self . build_hasher . hash_one ( & key) ;
773
+ let hash = hash_key ( & self . build_hasher , & key) ;
773
774
774
775
// TODO: This ugliness arises from borrow checking issues which seems to happen when the vacant entry is created in
775
776
// the match block further below for `Vacant` even though it should be perfectly safe. Is there a better way to do
@@ -819,7 +820,7 @@ where
819
820
Key : Borrow < KeyQuery > ,
820
821
KeyQuery : ?Sized + Eq + Hash ,
821
822
{
822
- let hash = self . build_hasher . hash_one ( key) ;
823
+ let hash = hash_key ( & self . build_hasher , & key) ;
823
824
824
825
match raw_entry ( & self . keys , & self . map , hash, key) {
825
826
Some ( ( _, map_entry) ) => map_entry. length ,
@@ -847,7 +848,7 @@ where
847
848
Key : Borrow < KeyQuery > ,
848
849
KeyQuery : ?Sized + Eq + Hash ,
849
850
{
850
- let hash = self . build_hasher . hash_one ( key) ;
851
+ let hash = hash_key ( & self . build_hasher , & key) ;
851
852
let ( _, map_entry) = raw_entry ( & self . keys , & self . map , hash, key) ?;
852
853
self
853
854
. values
@@ -880,7 +881,7 @@ where
880
881
Key : Borrow < KeyQuery > ,
881
882
KeyQuery : ?Sized + Eq + Hash ,
882
883
{
883
- let hash = self . build_hasher . hash_one ( key) ;
884
+ let hash = hash_key ( & self . build_hasher , & key) ;
884
885
885
886
match raw_entry ( & self . keys , & self . map , hash, key) {
886
887
Some ( ( _, map_entry) ) => EntryValues :: from_map_entry ( & self . values , map_entry) ,
@@ -918,7 +919,7 @@ where
918
919
Key : Borrow < KeyQuery > ,
919
920
KeyQuery : ?Sized + Eq + Hash ,
920
921
{
921
- let hash = self . build_hasher . hash_one ( key) ;
922
+ let hash = hash_key ( & self . build_hasher , & key) ;
922
923
923
924
match raw_entry ( & self . keys , & self . map , hash, key) {
924
925
Some ( ( _, map_entry) ) => EntryValuesMut :: from_map_entry ( & mut self . values , map_entry) ,
@@ -953,7 +954,7 @@ where
953
954
Key : Borrow < KeyQuery > ,
954
955
KeyQuery : ?Sized + Eq + Hash ,
955
956
{
956
- let hash = self . build_hasher . hash_one ( key) ;
957
+ let hash = hash_key ( & self . build_hasher , & key) ;
957
958
let ( _, map_entry) = raw_entry ( & self . keys , & self . map , hash, key) ?;
958
959
self
959
960
. values
@@ -1028,8 +1029,9 @@ where
1028
1029
/// assert_eq!(map.get(&"key"), Some(&"value3"));
1029
1030
/// ```
1030
1031
pub fn insert_all ( & mut self , key : Key , value : Value ) -> EntryValuesDrain < ' _ , Key , Value > {
1031
- let hash = self . build_hasher . hash_one ( & key) ;
1032
+ let hash = hash_key ( & self . build_hasher , & key) ;
1032
1033
let entry = raw_entry_mut ( & self . keys , & mut self . map , hash, & key) ;
1034
+ let build_hasher = & self . build_hasher ;
1033
1035
1034
1036
match entry {
1035
1037
RawEntryMut :: Occupied ( mut entry) => {
@@ -1048,7 +1050,7 @@ where
1048
1050
let keys = & self . keys ;
1049
1051
let _ = entry. insert_with_hasher ( hash, key_index, MapEntry :: new ( index) , |& key_index| {
1050
1052
let key = keys. get ( key_index) . unwrap ( ) ;
1051
- self . build_hasher . hash_one ( key)
1053
+ hash_key ( build_hasher , key)
1052
1054
} ) ;
1053
1055
EntryValuesDrain :: empty ( & mut self . values )
1054
1056
}
@@ -1101,6 +1103,7 @@ where
1101
1103
let key_map = self . keys . pack_to ( keys_minimum_capacity) ;
1102
1104
let value_map = self . values . pack_to ( values_minimum_capacity) ;
1103
1105
let mut map = HashMap :: with_capacity_and_hasher ( keys_minimum_capacity, DummyState ) ;
1106
+ let build_hasher = & self . build_hasher ;
1104
1107
1105
1108
for value_entry in self . values . iter_mut ( ) {
1106
1109
value_entry. key_index = key_map[ & value_entry. key_index ] ;
@@ -1113,14 +1116,14 @@ where
1113
1116
map_entry. tail_index = value_map[ & map_entry. tail_index ] ;
1114
1117
let key_index = key_map[ & key_index] ;
1115
1118
let key = self . keys . get ( key_index) . unwrap ( ) ;
1116
- let hash = self . build_hasher . hash_one ( key) ;
1119
+ let hash = hash_key ( & self . build_hasher , key) ;
1117
1120
1118
1121
match map. raw_entry_mut ( ) . from_hash ( hash, |_| false ) {
1119
1122
RawEntryMut :: Vacant ( entry) => {
1120
1123
let keys = & self . keys ;
1121
1124
let _ = entry. insert_with_hasher ( hash, key_index, map_entry, |& key_index| {
1122
1125
let key = keys. get ( key_index) . unwrap ( ) ;
1123
- self . build_hasher . hash_one ( key)
1126
+ hash_key ( build_hasher , key)
1124
1127
} ) ;
1125
1128
}
1126
1129
_ => panic ! ( "expected vacant entry" ) ,
@@ -1196,7 +1199,7 @@ where
1196
1199
let key_wrapper = match value_entry. previous_index {
1197
1200
Some ( previous_index) => {
1198
1201
let key = self . keys . get ( value_entry. key_index ) . unwrap ( ) ;
1199
- let hash = self . build_hasher . hash_one ( key) ;
1202
+ let hash = hash_key ( & self . build_hasher , & key) ;
1200
1203
1201
1204
let mut entry = match raw_entry_mut ( & self . keys , & mut self . map , hash, key) {
1202
1205
RawEntryMut :: Occupied ( entry) => entry,
@@ -1213,7 +1216,7 @@ where
1213
1216
}
1214
1217
None => {
1215
1218
let key = self . keys . remove ( value_entry. key_index ) . unwrap ( ) ;
1216
- let hash = self . build_hasher . hash_one ( & key) ;
1219
+ let hash = hash_key ( & self . build_hasher , & key) ;
1217
1220
1218
1221
match raw_entry_mut_empty ( & self . keys , & mut self . map , hash) {
1219
1222
RawEntryMut :: Occupied ( entry) => {
@@ -1265,7 +1268,7 @@ where
1265
1268
let key_wrapper = match value_entry. next_index {
1266
1269
Some ( next_index) => {
1267
1270
let key = self . keys . get ( value_entry. key_index ) . unwrap ( ) ;
1268
- let hash = self . build_hasher . hash_one ( key) ;
1271
+ let hash = hash_key ( & self . build_hasher , & key) ;
1269
1272
1270
1273
let mut entry = match raw_entry_mut ( & self . keys , & mut self . map , hash, key) {
1271
1274
RawEntryMut :: Occupied ( entry) => entry,
@@ -1282,7 +1285,7 @@ where
1282
1285
}
1283
1286
None => {
1284
1287
let key = self . keys . remove ( value_entry. key_index ) . unwrap ( ) ;
1285
- let hash = self . build_hasher . hash_one ( & key) ;
1288
+ let hash = hash_key ( & self . build_hasher , & key) ;
1286
1289
1287
1290
match raw_entry_mut_empty ( & self . keys , & mut self . map , hash) {
1288
1291
RawEntryMut :: Occupied ( entry) => {
@@ -1363,7 +1366,7 @@ where
1363
1366
Key : Borrow < KeyQuery > ,
1364
1367
KeyQuery : ?Sized + Eq + Hash ,
1365
1368
{
1366
- let hash = self . build_hasher . hash_one ( key) ;
1369
+ let hash = hash_key ( & self . build_hasher , & key) ;
1367
1370
let entry = raw_entry_mut ( & self . keys , & mut self . map , hash, key) ;
1368
1371
1369
1372
match entry {
@@ -1449,7 +1452,7 @@ where
1449
1452
Key : Borrow < KeyQuery > ,
1450
1453
KeyQuery : ?Sized + Eq + Hash ,
1451
1454
{
1452
- let hash = self . build_hasher . hash_one ( key) ;
1455
+ let hash = hash_key ( & self . build_hasher , & key) ;
1453
1456
let entry = raw_entry_mut ( & self . keys , & mut self . map , hash, key) ;
1454
1457
1455
1458
match entry {
@@ -1494,7 +1497,7 @@ where
1494
1497
1495
1498
for ( key_index, map_entry) in self . map . drain ( ) {
1496
1499
let key = self . keys . get ( key_index) . unwrap ( ) ;
1497
- let hash = self . build_hasher . hash_one ( key) ;
1500
+ let hash = hash_key ( & self . build_hasher , key) ;
1498
1501
let entry = match raw_entry_mut ( & self . keys , & mut map, hash, key) {
1499
1502
RawEntryMut :: Vacant ( entry) => entry,
1500
1503
_ => panic ! ( "expected vacant entry" ) ,
@@ -1560,7 +1563,7 @@ where
1560
1563
if function ( key, & mut value_entry. value ) {
1561
1564
true
1562
1565
} else {
1563
- let hash = build_hasher . hash_one ( key) ;
1566
+ let hash = hash_key ( build_hasher , key) ;
1564
1567
let mut entry = match raw_entry_mut ( keys, map, hash, key) {
1565
1568
RawEntryMut :: Occupied ( entry) => entry,
1566
1569
_ => panic ! ( "expected occupied entry in internal map" ) ,
@@ -2475,6 +2478,7 @@ where
2475
2478
/// assert_eq!(entry.insert("value"), &"value");
2476
2479
/// ```
2477
2480
pub fn insert ( self , value : Value ) -> & ' map mut Value {
2481
+ let build_hasher = self . build_hasher ;
2478
2482
let entry = match raw_entry_mut ( self . keys , self . map , self . hash , & self . key ) {
2479
2483
RawEntryMut :: Vacant ( entry) => entry,
2480
2484
_ => panic ! ( "expected vacant entry" ) ,
@@ -2486,7 +2490,7 @@ where
2486
2490
let keys = & self . keys ;
2487
2491
let _ = entry. insert_with_hasher ( self . hash , key_index, map_entry, |& key_index| {
2488
2492
let key = keys. get ( key_index) . unwrap ( ) ;
2489
- self . build_hasher . hash_one ( key)
2493
+ hash_key ( build_hasher , key)
2490
2494
} ) ;
2491
2495
2492
2496
& mut self . values . get_mut ( index) . unwrap ( ) . value
@@ -2509,6 +2513,7 @@ where
2509
2513
/// assert_eq!(entry.get(), &"value");
2510
2514
/// ```
2511
2515
pub fn insert_entry ( self , value : Value ) -> OccupiedEntry < ' map , Key , Value > {
2516
+ let build_hasher = self . build_hasher ;
2512
2517
let entry = match raw_entry_mut ( self . keys , self . map , self . hash , & self . key ) {
2513
2518
RawEntryMut :: Vacant ( entry) => entry,
2514
2519
_ => panic ! ( "expected vacant entry" ) ,
@@ -2520,7 +2525,7 @@ where
2520
2525
let keys = & self . keys ;
2521
2526
let _ = entry. insert_with_hasher ( self . hash , key_index, map_entry, |& key_index| {
2522
2527
let key = keys. get ( key_index) . unwrap ( ) ;
2523
- self . build_hasher . hash_one ( key)
2528
+ hash_key ( build_hasher , key)
2524
2529
} ) ;
2525
2530
2526
2531
let key = self . keys . get ( key_index) . unwrap ( ) ;
@@ -3161,7 +3166,7 @@ where
3161
3166
{
3162
3167
fn next_back ( & mut self ) -> Option < Self :: Item > {
3163
3168
let key = self . iter . next_back ( ) ?;
3164
- let hash = self . build_hasher . hash_one ( key) ;
3169
+ let hash = hash_key ( self . build_hasher , key) ;
3165
3170
let ( _, map_entry) = raw_entry ( self . keys , self . map , hash, key) . unwrap ( ) ;
3166
3171
let iter = EntryValues :: from_map_entry ( self . values , map_entry) ;
3167
3172
Some ( ( key, iter) )
@@ -3191,7 +3196,7 @@ where
3191
3196
3192
3197
fn next ( & mut self ) -> Option < Self :: Item > {
3193
3198
let key = self . iter . next ( ) ?;
3194
- let hash = self . build_hasher . hash_one ( key) ;
3199
+ let hash = hash_key ( self . build_hasher , key) ;
3195
3200
let ( _, map_entry) = raw_entry ( self . keys , self . map , hash, key) . unwrap ( ) ;
3196
3201
let iter = EntryValues :: from_map_entry ( self . values , map_entry) ;
3197
3202
Some ( ( key, iter) )
@@ -3255,7 +3260,7 @@ where
3255
3260
{
3256
3261
fn next_back ( & mut self ) -> Option < Self :: Item > {
3257
3262
let key = self . iter . next_back ( ) ?;
3258
- let hash = self . build_hasher . hash_one ( key) ;
3263
+ let hash = hash_key ( self . build_hasher , key) ;
3259
3264
let ( _, map_entry) = raw_entry ( self . keys , self . map , hash, key) . unwrap ( ) ;
3260
3265
let iter = EntryValuesMut :: from_map_entry ( unsafe { & mut * self . values } , map_entry) ;
3261
3266
Some ( ( key, iter) )
@@ -3285,7 +3290,7 @@ where
3285
3290
3286
3291
fn next ( & mut self ) -> Option < Self :: Item > {
3287
3292
let key = self . iter . next ( ) ?;
3288
- let hash = self . build_hasher . hash_one ( key) ;
3293
+ let hash = hash_key ( self . build_hasher , key) ;
3289
3294
let ( _, map_entry) = raw_entry ( self . keys , self . map , hash, key) . unwrap ( ) ;
3290
3295
let iter = EntryValuesMut :: from_map_entry ( unsafe { & mut * self . values } , map_entry) ;
3291
3296
Some ( ( key, iter) )
@@ -3469,6 +3474,18 @@ impl Hasher for DummyHasher {
3469
3474
}
3470
3475
}
3471
3476
3477
+ /// Computes the hash value of the given key.
3478
+ #[ must_use]
3479
+ fn hash_key < KeyQuery , State > ( state : & State , key : & KeyQuery ) -> u64
3480
+ where
3481
+ KeyQuery : ?Sized + Eq + Hash ,
3482
+ State : BuildHasher ,
3483
+ {
3484
+ let mut hasher = state. build_hasher ( ) ;
3485
+ key. hash ( & mut hasher) ;
3486
+ hasher. finish ( )
3487
+ }
3488
+
3472
3489
#[ must_use]
3473
3490
fn raw_entry < ' map , Key , KeyQuery , Value , State > (
3474
3491
keys : & VecList < Key > ,
@@ -3570,7 +3587,7 @@ mod test {
3570
3587
let mut map = ListOrderedMultimap :: with_hasher ( TestBuildHasher ) ;
3571
3588
let state = map. hasher ( ) ;
3572
3589
3573
- assert_eq ! ( state . hash_one ( "key1" ) , state . hash_one ( "key2" ) ) ;
3590
+ assert_eq ! ( hash_key ( state , "key1" ) , hash_key ( state , "key2" ) ) ;
3574
3591
3575
3592
map. insert ( "key1" , "value1" ) ;
3576
3593
assert_eq ! ( map. get( & "key1" ) , Some ( & "value1" ) ) ;
@@ -3582,8 +3599,8 @@ mod test {
3582
3599
#[ test]
3583
3600
fn test_no_collision ( ) {
3584
3601
let state = RandomState :: new ( ) ;
3585
- let hash_1 = state . hash_one ( "key1" ) ;
3586
- let hash_2 = state . hash_one ( "key2" ) ;
3602
+ let hash_1 = hash_key ( & state , "key1" ) ;
3603
+ let hash_2 = hash_key ( & state , "key2" ) ;
3587
3604
3588
3605
assert ! ( hash_1 != hash_2) ;
3589
3606
}
0 commit comments