1# Change Log 2 3All notable changes to this project will be documented in this file. 4 5The format is based on [Keep a Changelog](https://keepachangelog.com/) 6and this project adheres to [Semantic Versioning](https://semver.org/). 7 8## [Unreleased] 9 10## [v0.15.0] - 2024-10-01 11 12This update contains breaking changes that remove the `raw` API with the hope of 13centralising on the `HashTable` API in the future. You can follow the discussion 14and progress in #545 to discuss features you think should be added to this API 15that were previously only possible on the `raw` API. 16 17### Added 18 19- Added `borsh` feature with `BorshSerialize` and `BorshDeserialize` impls. (#525) 20- Added `Assign` impls for `HashSet` operators. (#529) 21- Added `Default` impls for iterator types. (#542) 22- Added `HashTable::iter_hash{,_mut}` methods. (#549) 23- Added `Hash{Table,Map,Set}::allocation_size` methods. (#553) 24- Implemented `Debug` and `FusedIterator` for all `HashTable` iterators. (#561) 25- Specialized `Iterator::fold` for all `HashTable` iterators. (#561) 26 27### Changed 28 29- Changed `hash_set::VacantEntry::insert` to return `OccupiedEntry`. (#495) 30- Improved`hash_set::Difference::size_hint` lower-bound. (#530) 31- Improved `HashSet::is_disjoint` performance. (#531) 32- `equivalent` feature is now enabled by default. (#532) 33- `HashSet` operators now return a set with the same allocator. (#529) 34- Changed the default hasher to foldhash. (#563) 35- `ahash` feature has been renamed to `default-hasher`. (#533) 36- Entry API has been reworked and several methods have been renamed. (#535) 37- `Hash{Map,Set}::insert_unique_unchecked` is now unsafe. (#556) 38- The signature of `get_many_mut` and related methods was changed. (#562) 39 40### Fixed 41 42* Fixed typos, stray backticks in docs. (#558, #560) 43 44### Removed 45 46- Raw entry API is now under `raw-entry` feature, to be eventually removed. (#534, #555) 47- Raw table API has been made private and the `raw` feature is removed; 48 in the future, all code should be using the `HashTable` API instead. (#531, #546) 49- `rykv` feature was removed; this is now provided by the `rykv` crate instead. (#554) 50- `HashSet::get_or_insert_owned` was removed in favor of `get_or_insert_with`. (#555) 51 52## [v0.14.5] - 2024-04-28 53 54### Fixed 55 56- Fixed index calculation in panic guard of `clone_from_impl`. (#511) 57 58## ~~[v0.14.4] - 2024-03-19~~ 59 60This release was _yanked_ due to a breaking change. 61 62## [v0.14.3] - 2023-11-26 63 64### Added 65 66- Specialized `fold` implementation of iterators. (#480) 67 68### Fixed 69 70- Avoid using unstable `ptr::invalid_mut` on nightly. (#481) 71 72## [v0.14.2] - 2023-10-19 73 74### Added 75 76- `HashTable` type which provides a low-level but safe API with explicit hashing. (#466) 77 78### Fixed 79 80- Disabled the use of NEON instructions on big-endian ARM. (#475) 81- Disabled the use of NEON instructions on Miri. (#476) 82 83## [v0.14.1] - 2023-09-28 84 85### Added 86 87- Allow serializing `HashMap`s that use a custom allocator. (#449) 88 89### Changed 90 91- Use the `Equivalent` trait from the `equivalent` crate. (#442) 92- Slightly improved performance of table resizing. (#451) 93- Relaxed MSRV to 1.63.0. (#457) 94- Removed `Clone` requirement from custom allocators. (#468) 95 96### Fixed 97 98- Fixed custom allocators being leaked in some situations. (#439, #465) 99 100## [v0.14.0] - 2023-06-01 101 102### Added 103 104- Support for `allocator-api2` crate 105 for interfacing with custom allocators on stable. (#417) 106- Optimized implementation for ARM using NEON instructions. (#430) 107- Support for rkyv serialization. (#432) 108- `Equivalent` trait to look up values without `Borrow`. (#345) 109- `Hash{Map,Set}::raw_table_mut` is added which returns a mutable reference. (#404) 110- Fast path for `clear` on empty tables. (#428) 111 112### Changed 113 114- Optimized insertion to only perform a single lookup. (#277) 115- `DrainFilter` (`drain_filter`) has been renamed to `ExtractIf` and no longer drops remaining 116 elements when the iterator is dropped. #(374) 117- Bumped MSRV to 1.64.0. (#431) 118- `{Map,Set}::raw_table` now returns an immutable reference. (#404) 119- `VacantEntry` and `OccupiedEntry` now use the default hasher if none is 120 specified in generics. (#389) 121- `RawTable::data_start` now returns a `NonNull` to match `RawTable::data_end`. (#387) 122- `RawIter::{reflect_insert, reflect_remove}` are now unsafe. (#429) 123- `RawTable::find_potential` is renamed to `find_or_find_insert_slot` and returns an `InsertSlot`. (#429) 124- `RawTable::remove` now also returns an `InsertSlot`. (#429) 125- `InsertSlot` can be used to insert an element with `RawTable::insert_in_slot`. (#429) 126- `RawIterHash` no longer has a lifetime tied to that of the `RawTable`. (#427) 127- The trait bounds of `HashSet::raw_table` have been relaxed to not require `Eq + Hash`. (#423) 128- `EntryRef::and_replace_entry_with` and `OccupiedEntryRef::replace_entry_with` 129 were changed to give a `&K` instead of a `&Q` to the closure. 130 131### Removed 132 133- Support for `bumpalo` as an allocator with custom wrapper. 134 Use `allocator-api2` feature in `bumpalo` to use it as an allocator 135 for `hashbrown` collections. (#417) 136 137## [v0.13.2] - 2023-01-12 138 139### Fixed 140 141- Added `#[inline(always)]` to `find_inner`. (#375) 142- Fixed `RawTable::allocation_info` for empty tables. (#376) 143 144## [v0.13.1] - 2022-11-10 145 146### Added 147 148- Added `Equivalent` trait to customize key lookups. (#350) 149- Added support for 16-bit targets. (#368) 150- Added `RawTable::allocation_info` which provides information about the memory 151 usage of a table. (#371) 152 153### Changed 154 155- Bumped MSRV to 1.61.0. 156- Upgraded to `ahash` 0.8. (#357) 157- Make `with_hasher_in` const. (#355) 158- The following methods have been removed from the `RawTable` API in favor of 159 safer alternatives: 160 - `RawTable::erase_no_drop` => Use `RawTable::erase` or `RawTable::remove` instead. 161 - `Bucket::read` => Use `RawTable::remove` instead. 162 - `Bucket::drop` => Use `RawTable::erase` instead. 163 - `Bucket::write` => Use `Bucket::as_mut` instead. 164 165### Fixed 166 167- Ensure that `HashMap` allocations don't exceed `isize::MAX`. (#362) 168- Fixed issue with field retagging in scopeguard. (#359) 169 170## [v0.12.3] - 2022-07-17 171 172### Fixed 173 174- Fixed double-drop in `RawTable::clone_from`. (#348) 175 176## [v0.12.2] - 2022-07-09 177 178### Added 179 180- Added `Entry` API for `HashSet`. (#342) 181- Added `Extend<&'a (K, V)> for HashMap<K, V, S, A>`. (#340) 182- Added length-based short-circuiting for hash table iteration. (#338) 183- Added a function to access the `RawTable` of a `HashMap`. (#335) 184 185### Changed 186 187- Edited `do_alloc` to reduce LLVM IR generated. (#341) 188 189## [v0.12.1] - 2022-05-02 190 191### Fixed 192 193- Fixed underflow in `RawIterRange::size_hint`. (#325) 194- Fixed the implementation of `Debug` for `ValuesMut` and `IntoValues`. (#325) 195 196## [v0.12.0] - 2022-01-17 197 198### Added 199 200- Added `From<[T; N]>` and `From<[(K, V); N]>` for `HashSet` and `HashMap` respectively. (#297) 201- Added an `allocator()` getter to HashMap and HashSet. (#257) 202- Added `insert_unique_unchecked` to `HashMap` and `HashSet`. (#293) 203- Added `into_keys` and `into_values` to HashMap. (#295) 204- Implement `From<array>` on `HashSet` and `HashMap`. (#298) 205- Added `entry_ref` API to `HashMap`. (#201) 206 207### Changed 208 209- Bumped minimum Rust version to 1.56.1 and edition to 2021. 210- Use u64 for the GroupWord on WebAssembly. (#271) 211- Optimized `find`. (#279) 212- Made rehashing and resizing less generic to reduce compilation time. (#282) 213- Inlined small functions. (#283) 214- Use `BuildHasher::hash_one` when `feature = "nightly"` is enabled. (#292) 215- Relaxed the bounds on `Debug` for `HashSet`. (#296) 216- Rename `get_each_mut` to `get_many_mut` and align API with the stdlib. (#291) 217- Don't hash the key when searching in an empty table. (#305) 218 219### Fixed 220 221- Guard against allocations exceeding isize::MAX. (#268) 222- Made `RawTable::insert_no_grow` unsafe. (#254) 223- Inline `static_empty`. (#280) 224- Fixed trait bounds on Send/Sync impls. (#303) 225 226## [v0.11.2] - 2021-03-25 227 228### Fixed 229 230- Added missing allocator type parameter to `HashMap`'s and `HashSet`'s `Clone` impls. (#252) 231 232## [v0.11.1] - 2021-03-20 233 234### Fixed 235 236- Added missing `pub` modifier to `BumpWrapper`. (#251) 237 238## [v0.11.0] - 2021-03-14 239 240### Added 241- Added safe `try_insert_no_grow` method to `RawTable`. (#229) 242- Added support for `bumpalo` as an allocator without the `nightly` feature. (#231) 243- Implemented `Default` for `RawTable`. (#237) 244- Added new safe methods `RawTable::get_each_mut`, `HashMap::get_each_mut`, and 245 `HashMap::get_each_key_value_mut`. (#239) 246- Added `From<HashMap<T, ()>>` for `HashSet<T>`. (#235) 247- Added `try_insert` method to `HashMap`. (#247) 248 249### Changed 250- The minimum Rust version has been bumped to 1.49.0. (#230) 251- Significantly improved compilation times by reducing the amount of generated IR. (#205) 252 253### Removed 254- We no longer re-export the unstable allocator items from the standard library, nor the stable shims approximating the same. (#227) 255- Removed hasher specialization support from `aHash`, which was resulting in inconsistent hashes being generated for a key. (#248) 256 257### Fixed 258- Fixed union length comparison. (#228) 259 260## ~~[v0.10.0] - 2021-01-16~~ 261 262This release was _yanked_ due to inconsistent hashes being generated with the `nightly` feature. (#248) 263 264### Changed 265- Parametrized `RawTable`, `HashSet` and `HashMap` over an allocator. (#133) 266- Improved branch prediction hints on stable. (#209) 267- Optimized hashing of primitive types with AHash using specialization. (#207) 268- Only instantiate `RawTable`'s reserve functions once per key-value. (#204) 269 270## [v0.9.1] - 2020-09-28 271 272### Added 273- Added safe methods to `RawTable` (#202): 274 - `get`: `find` and `as_ref` 275 - `get_mut`: `find` and `as_mut` 276 - `insert_entry`: `insert` and `as_mut` 277 - `remove_entry`: `find` and `remove` 278 - `erase_entry`: `find` and `erase` 279 280### Changed 281- Removed `from_key_hashed_nocheck`'s `Q: Hash`. (#200) 282- Made `RawTable::drain` safe. (#201) 283 284## [v0.9.0] - 2020-09-03 285 286### Fixed 287- `drain_filter` now removes and yields items that do match the predicate, 288 rather than items that don't. This is a **breaking change** to match the 289 behavior of the `drain_filter` methods in `std`. (#187) 290 291### Added 292- Added `replace_entry_with` to `OccupiedEntry`, and `and_replace_entry_with` to `Entry`. (#190) 293- Implemented `FusedIterator` and `size_hint` for `DrainFilter`. (#188) 294 295### Changed 296- The minimum Rust version has been bumped to 1.36 (due to `crossbeam` dependency). (#193) 297- Updated `ahash` dependency to 0.4. (#198) 298- `HashMap::with_hasher` and `HashSet::with_hasher` are now `const fn`. (#195) 299- Removed `T: Hash + Eq` and `S: BuildHasher` bounds on `HashSet::new`, 300 `with_capacity`, `with_hasher`, and `with_capacity_and_hasher`. (#185) 301 302## [v0.8.2] - 2020-08-08 303 304### Changed 305- Avoid closures to improve compile times. (#183) 306- Do not iterate to drop if empty. (#182) 307 308## [v0.8.1] - 2020-07-16 309 310### Added 311- Added `erase` and `remove` to `RawTable`. (#171) 312- Added `try_with_capacity` to `RawTable`. (#174) 313- Added methods that allow re-using a `RawIter` for `RawDrain`, 314 `RawIntoIter`, and `RawParIter`. (#175) 315- Added `reflect_remove` and `reflect_insert` to `RawIter`. (#175) 316- Added a `drain_filter` function to `HashSet`. (#179) 317 318### Changed 319- Deprecated `RawTable::erase_no_drop` in favor of `erase` and `remove`. (#176) 320- `insert_no_grow` is now exposed under the `"raw"` feature. (#180) 321 322## [v0.8.0] - 2020-06-18 323 324### Fixed 325- Marked `RawTable::par_iter` as `unsafe`. (#157) 326 327### Changed 328- Reduced the size of `HashMap`. (#159) 329- No longer create tables with a capacity of 1 element. (#162) 330- Removed `K: Eq + Hash` bounds on `retain`. (#163) 331- Pulled in `HashMap` changes from rust-lang/rust (#164): 332 - `extend_one` support on nightly. 333 - `CollectionAllocErr` renamed to `TryReserveError`. 334 - Added `HashSet::get_or_insert_owned`. 335 - `Default` for `HashSet` no longer requires `T: Eq + Hash` and `S: BuildHasher`. 336 337## [v0.7.2] - 2020-04-27 338 339### Added 340- Added `or_insert_with_key` to `Entry`. (#152) 341 342### Fixed 343- Partially reverted `Clone` optimization which was unsound. (#154) 344 345### Changed 346- Disabled use of `const-random` by default, which prevented reproducible builds. (#155) 347- Optimized `repeat` function. (#150) 348- Use `NonNull` for buckets, which improves codegen for iterators. (#148) 349 350## [v0.7.1] - 2020-03-16 351 352### Added 353- Added `HashMap::get_key_value_mut`. (#145) 354 355### Changed 356- Optimized `Clone` implementation. (#146) 357 358## [v0.7.0] - 2020-01-31 359 360### Added 361- Added a `drain_filter` function to `HashMap`. (#135) 362 363### Changed 364- Updated `ahash` dependency to 0.3. (#141) 365- Optimized set union and intersection. (#130) 366- `raw_entry` can now be used without requiring `S: BuildHasher`. (#123) 367- `RawTable::bucket_index` can now be used under the `raw` feature. (#128) 368 369## [v0.6.3] - 2019-10-31 370 371### Added 372- Added an `ahash-compile-time-rng` feature (enabled by default) which allows disabling the 373 `compile-time-rng` feature in `ahash` to work around a Cargo bug. (#125) 374 375## [v0.6.2] - 2019-10-23 376 377### Added 378- Added an `inline-more` feature (enabled by default) which allows choosing a tradeoff between 379 runtime performance and compilation time. (#119) 380 381## [v0.6.1] - 2019-10-04 382 383### Added 384- Added `Entry::insert` and `RawEntryMut::insert`. (#118) 385 386### Changed 387- `Group::static_empty` was changed from a `const` to a `static` (#116). 388 389## [v0.6.0] - 2019-08-13 390 391### Fixed 392- Fixed AHash accidentally depending on `std`. (#110) 393 394### Changed 395- The minimum Rust version has been bumped to 1.32 (due to `rand` dependency). 396 397## ~~[v0.5.1] - 2019-08-04~~ 398 399This release was _yanked_ due to a breaking change for users of `no-default-features`. 400 401### Added 402- The experimental and unsafe `RawTable` API is available under the "raw" feature. (#108) 403- Added entry-like methods for `HashSet`. (#98) 404 405### Changed 406- Changed the default hasher from FxHash to AHash. (#97) 407- `hashbrown` is now fully `no_std` on recent Rust versions (1.36+). (#96) 408 409### Fixed 410- We now avoid growing the table during insertions when it wasn't necessary. (#106) 411- `RawOccupiedEntryMut` now properly implements `Send` and `Sync`. (#100) 412- Relaxed `lazy_static` version. (#92) 413 414## [v0.5.0] - 2019-06-12 415 416### Fixed 417- Resize with a more conservative amount of space after deletions. (#86) 418 419### Changed 420- Exposed the Layout of the failed allocation in CollectionAllocErr::AllocErr. (#89) 421 422## [v0.4.0] - 2019-05-30 423 424### Fixed 425- Fixed `Send` trait bounds on `IterMut` not matching the libstd one. (#82) 426 427## [v0.3.1] - 2019-05-30 428 429### Fixed 430- Fixed incorrect use of slice in unsafe code. (#80) 431 432## [v0.3.0] - 2019-04-23 433 434### Changed 435- Changed shrink_to to not panic if min_capacity < capacity. (#67) 436 437### Fixed 438- Worked around emscripten bug emscripten-core/emscripten-fastcomp#258. (#66) 439 440## [v0.2.2] - 2019-04-16 441 442### Fixed 443- Inlined non-nightly lowest_set_bit_nonzero. (#64) 444- Fixed build on latest nightly. (#65) 445 446## [v0.2.1] - 2019-04-14 447 448### Changed 449- Use for_each in map Extend and FromIterator. (#58) 450- Improved worst-case performance of HashSet.is_subset. (#61) 451 452### Fixed 453- Removed incorrect debug_assert. (#60) 454 455## [v0.2.0] - 2019-03-31 456 457### Changed 458- The code has been updated to Rust 2018 edition. This means that the minimum 459 Rust version has been bumped to 1.31 (2018 edition). 460 461### Added 462- Added `insert_with_hasher` to the raw_entry API to allow `K: !(Hash + Eq)`. (#54) 463- Added support for using hashbrown as the hash table implementation in libstd. (#46) 464 465### Fixed 466- Fixed cargo build with minimal-versions. (#45) 467- Fixed `#[may_dangle]` attributes to match the libstd `HashMap`. (#46) 468- ZST keys and values are now handled properly. (#46) 469 470## [v0.1.8] - 2019-01-14 471 472### Added 473- Rayon parallel iterator support (#37) 474- `raw_entry` support (#31) 475- `#[may_dangle]` on nightly (#31) 476- `try_reserve` support (#31) 477 478### Fixed 479- Fixed variance on `IterMut`. (#31) 480 481## [v0.1.7] - 2018-12-05 482 483### Fixed 484- Fixed non-SSE version of convert_special_to_empty_and_full_to_deleted. (#32) 485- Fixed overflow in rehash_in_place. (#33) 486 487## [v0.1.6] - 2018-11-17 488 489### Fixed 490- Fixed compile error on nightly. (#29) 491 492## [v0.1.5] - 2018-11-08 493 494### Fixed 495- Fixed subtraction overflow in generic::Group::match_byte. (#28) 496 497## [v0.1.4] - 2018-11-04 498 499### Fixed 500- Fixed a bug in the `erase_no_drop` implementation. (#26) 501 502## [v0.1.3] - 2018-11-01 503 504### Added 505- Serde support. (#14) 506 507### Fixed 508- Make the compiler inline functions more aggressively. (#20) 509 510## [v0.1.2] - 2018-10-31 511 512### Fixed 513- `clear` segfaults when called on an empty table. (#13) 514 515## [v0.1.1] - 2018-10-30 516 517### Fixed 518- `erase_no_drop` optimization not triggering in the SSE2 implementation. (#3) 519- Missing `Send` and `Sync` for hash map and iterator types. (#7) 520- Bug when inserting into a table smaller than the group width. (#5) 521 522## v0.1.0 - 2018-10-29 523 524- Initial release 525 526[Unreleased]: https://github.com/rust-lang/hashbrown/compare/v0.15.0...HEAD 527[v0.15.0]: https://github.com/rust-lang/hashbrown/compare/v0.14.5...v0.15.0 528[v0.14.5]: https://github.com/rust-lang/hashbrown/compare/v0.14.4...v0.14.5 529[v0.14.4]: https://github.com/rust-lang/hashbrown/compare/v0.14.3...v0.14.4 530[v0.14.3]: https://github.com/rust-lang/hashbrown/compare/v0.14.2...v0.14.3 531[v0.14.2]: https://github.com/rust-lang/hashbrown/compare/v0.14.1...v0.14.2 532[v0.14.1]: https://github.com/rust-lang/hashbrown/compare/v0.14.0...v0.14.1 533[v0.14.0]: https://github.com/rust-lang/hashbrown/compare/v0.13.2...v0.14.0 534[v0.13.2]: https://github.com/rust-lang/hashbrown/compare/v0.13.1...v0.13.2 535[v0.13.1]: https://github.com/rust-lang/hashbrown/compare/v0.12.3...v0.13.1 536[v0.12.3]: https://github.com/rust-lang/hashbrown/compare/v0.12.2...v0.12.3 537[v0.12.2]: https://github.com/rust-lang/hashbrown/compare/v0.12.1...v0.12.2 538[v0.12.1]: https://github.com/rust-lang/hashbrown/compare/v0.12.0...v0.12.1 539[v0.12.0]: https://github.com/rust-lang/hashbrown/compare/v0.11.2...v0.12.0 540[v0.11.2]: https://github.com/rust-lang/hashbrown/compare/v0.11.1...v0.11.2 541[v0.11.1]: https://github.com/rust-lang/hashbrown/compare/v0.11.0...v0.11.1 542[v0.11.0]: https://github.com/rust-lang/hashbrown/compare/v0.10.0...v0.11.0 543[v0.10.0]: https://github.com/rust-lang/hashbrown/compare/v0.9.1...v0.10.0 544[v0.9.1]: https://github.com/rust-lang/hashbrown/compare/v0.9.0...v0.9.1 545[v0.9.0]: https://github.com/rust-lang/hashbrown/compare/v0.8.2...v0.9.0 546[v0.8.2]: https://github.com/rust-lang/hashbrown/compare/v0.8.1...v0.8.2 547[v0.8.1]: https://github.com/rust-lang/hashbrown/compare/v0.8.0...v0.8.1 548[v0.8.0]: https://github.com/rust-lang/hashbrown/compare/v0.7.2...v0.8.0 549[v0.7.2]: https://github.com/rust-lang/hashbrown/compare/v0.7.1...v0.7.2 550[v0.7.1]: https://github.com/rust-lang/hashbrown/compare/v0.7.0...v0.7.1 551[v0.7.0]: https://github.com/rust-lang/hashbrown/compare/v0.6.3...v0.7.0 552[v0.6.3]: https://github.com/rust-lang/hashbrown/compare/v0.6.2...v0.6.3 553[v0.6.2]: https://github.com/rust-lang/hashbrown/compare/v0.6.1...v0.6.2 554[v0.6.1]: https://github.com/rust-lang/hashbrown/compare/v0.6.0...v0.6.1 555[v0.6.0]: https://github.com/rust-lang/hashbrown/compare/v0.5.1...v0.6.0 556[v0.5.1]: https://github.com/rust-lang/hashbrown/compare/v0.5.0...v0.5.1 557[v0.5.0]: https://github.com/rust-lang/hashbrown/compare/v0.4.0...v0.5.0 558[v0.4.0]: https://github.com/rust-lang/hashbrown/compare/v0.3.1...v0.4.0 559[v0.3.1]: https://github.com/rust-lang/hashbrown/compare/v0.3.0...v0.3.1 560[v0.3.0]: https://github.com/rust-lang/hashbrown/compare/v0.2.2...v0.3.0 561[v0.2.2]: https://github.com/rust-lang/hashbrown/compare/v0.2.1...v0.2.2 562[v0.2.1]: https://github.com/rust-lang/hashbrown/compare/v0.2.0...v0.2.1 563[v0.2.0]: https://github.com/rust-lang/hashbrown/compare/v0.1.8...v0.2.0 564[v0.1.8]: https://github.com/rust-lang/hashbrown/compare/v0.1.7...v0.1.8 565[v0.1.7]: https://github.com/rust-lang/hashbrown/compare/v0.1.6...v0.1.7 566[v0.1.6]: https://github.com/rust-lang/hashbrown/compare/v0.1.5...v0.1.6 567[v0.1.5]: https://github.com/rust-lang/hashbrown/compare/v0.1.4...v0.1.5 568[v0.1.4]: https://github.com/rust-lang/hashbrown/compare/v0.1.3...v0.1.4 569[v0.1.3]: https://github.com/rust-lang/hashbrown/compare/v0.1.2...v0.1.3 570[v0.1.2]: https://github.com/rust-lang/hashbrown/compare/v0.1.1...v0.1.2 571[v0.1.1]: https://github.com/rust-lang/hashbrown/compare/v0.1.0...v0.1.1 572