PackageTrack
Sign in Get early access

iddqd

Maps where keys borrow from values, including bijective and trijective maps.

0.4.6 5.1M downloads/mo #4483 most downloaded on crates.io oxidecomputer/iddqd

What this package is like to depend on

Last release 1 months ago

21 Jul 2026

Release timing varies

gaps range from 8 days to 5 months

Nearly every release is documented

notes for 31 of 31 stable releases

Nothing withdrawn

no release was ever pulled

1 years old

31 releases · first in 2025

14 releases in the last 12 months

see the full history below

Release timeline

31 releases · May 2025 to Jul 2026
2026
Release Pre-release

Releases

latest 31
  1. 0.4.6 21 Jul 2026
    Release notes

    Added

    • from_iter_unique constructors on IdHashMap, BiHashMap, and TriHashMap, matching the existing IdOrdMap::from_iter_unique. These build a map from an iterator and, rather than overwriting, return an error on the first item that conflicts with an already-inserted one.

      Because a value in a BiHashMap or TriHashMap can conflict on more than one key at once, the error reports every distinct existing item it collides with (up to two for BiHashMap and up to three for TriHashMap).

    Changed

    • MSRV updated to Rust 1.86.

    Fixed

    • Deserialization no longer preallocates based on an unbounded size hint. Length-prefixed formats such as bincode and postcard derive their size hint from the input, so a small hostile payload claiming a huge number of elements could previously cause an excessively large allocation before any element was read. Preallocation is now capped at 1 MiB worth of items, matching what serde does for the standard library's collections.

    • The insert_overwrite path on IdHashMap no longer aborts when an allocation fails, matching the existing guarantee on BiHashMap and TriHashMap. Instead, it results in a catchable panic. (The map is left unchanged, similar to BiHashMap and TriHashMap.)

      Note that BTreeMap::insert_overwrite will abort on allocation failure, because it calls into std which doesn't have an equivalent to HashMap::try_reserve.

    Other improvements

    • The insert paths now do fewer redundant checks for duplicates. Thanks izuzak for your first contribution!
    Open source →
    Release notes

    Added

    • from_iter_unique constructors on IdHashMap, BiHashMap, and TriHashMap, matching the existing IdOrdMap::from_iter_unique. These build a map from an iterator and, rather than overwriting, return an error on the first item that conflicts with an already-inserted one.

      Because a value in a BiHashMap or TriHashMap can conflict on more than one key at once, the error reports every distinct existing item it collides with (up to two for BiHashMap and up to three for TriHashMap).

    Changed

    • MSRV updated to Rust 1.86.

    Fixed

    • Deserialization no longer preallocates based on an unbounded size hint. Length-prefixed formats such as bincode and postcard derive their size hint from the input, so a small hostile payload claiming a huge number of elements could previously cause an excessively large allocation before any element was read. Preallocation is now capped at 1 MiB worth of items, matching what serde does for the standard library's collections.

    • The insert_overwrite path on IdHashMap no longer aborts when an allocation fails, matching the existing guarantee on BiHashMap and TriHashMap. Instead, it results in a catchable panic. (The map is left unchanged, similar to BiHashMap and TriHashMap.)

      Note that BTreeMap::insert_overwrite will abort on allocation failure, because it calls into std which doesn't have an equivalent to HashMap::try_reserve.

    Other improvements

    • The insert paths now do fewer redundant checks for duplicates. Thanks izuzak for your first contribution!
    Open source →
  2. 0.4.5 17 Jun 2026
    Release notes

    Added

    • iddqd's core invariants are now formally verified under adversarial Hash and Ord impls using the Soteria symbolic executor. No new bugs were found during this process.

      The formal verification is broad (covers all possible adversarial return values) but bounded-depth; it acts as a complement to the existing layers of randomized testing, which are less broad but generate much deeper operation sequences.

      For more information on our validation philosophy, see this Oxide blog entry.

    • Expanded examples for BiHashMap's Entry.

    Open source →
    Release notes

    Added

    • iddqd's core invariants are now formally verified under adversarial Hash and Ord impls using the Soteria symbolic executor. No new bugs were found during this process.

      The formal verification is broad (covers all possible adversarial return values) but bounded-depth; it acts as a complement to the existing layers of randomized testing, which are less broad but generate much deeper operation sequences.

      For more information on our validation philosophy, see this Oxide blog entry.

    • Expanded examples for BiHashMap's Entry.

    Open source →
  3. 0.4.4 09 Jun 2026
    Release notes

    Changed

    • The FromIterator implementations now reserve capacity at the start of the operation.
    Open source →
    Release notes

    Changed

    • The FromIterator implementations now reserve capacity at the start of the operation.
    Open source →
  4. 0.4.3 08 Jun 2026
    Release notes

    Fixed

    • The insert_overwrite paths on BiHashMap and TriHashMap are now atomic in case user code panics. Thanks to SG-devel for your first contribution!
    Open source →
    Release notes

    Fixed

    • The insert_overwrite paths on BiHashMap and TriHashMap are now atomic in case user code panics. Thanks to SG-devel for your first contribution!
    Open source →
  5. 0.4.2 23 May 2026
    Release notes

    Fixed

    • The retain callbacks no longer permit the RefMut to be stashed outside them. This is technically a breaking change, but is being treated as a soundness bugfix.
    • A number of soundness and resilience fixes for pathological implementations. These were found through a combination of human-driven analysis, example-based tests with Miri, chaos testing using fault injection with proptest, and adversarial code review from Claude Opus 4.7 and GPT-5.5. In particular, iddqd now more consistently preserves internal map state across panics in user code by using patterns like prepare-then-commit, index-based cleanup, cached hashes, and careful ordering of user-code execution relative to internal mutations.

    Changed

    • MSRV updated to Rust 1.85.
    Open source →
    Release notes

    Fixed

    • The retain callbacks no longer permit the RefMut to be stashed outside them. This is technically a breaking change, but is being treated as a soundness bugfix.
    • A number of soundness and resilience fixes for pathological implementations. These were found through a combination of human-driven analysis, example-based tests with Miri, chaos testing using fault injection with proptest, and adversarial code review from Claude Opus 4.7 and GPT-5.5. In particular, iddqd now more consistently preserves internal map state across panics in user code by using patterns like prepare-then-commit, index-based cleanup, cached hashes, and careful ordering of user-code execution relative to internal mutations.

    Changed

    • MSRV updated to Rust 1.85.
    Open source →
  6. 0.4.1 16 May 2026
    Release notes

    Fixed

    • Fixed a logic bug in TriHashMap::remove_unique, when key1 matches, and one of key2 and key3 matches, but not the other.
    Open source →
    Release notes

    Fixed

    • Fixed a logic bug in TriHashMap::remove_unique, when key1 matches, and one of key2 and key3 matches, but not the other.
    Open source →
  7. 0.4.0 04 May 2026
    Release notes

    Changed

    • The internal implementation for item storage has been changed to use a linear slot-based buffer, resulting in 2-3x performance improvements for most workloads.
    • The maps now have a limit of u32::MAX (4 294 967 295) elements at any given time. This limit is very unlikely to be reached in practice.

    Fixed

    • All mutation methods for IdHashMap and IdOrdMap are now panic-safe, in the sense that a panic in user code will not corrupt the map. This does not currently extend to BiHashMap and TriHashMap

    Added

    • Many more unit and property-based tests covering various kinds of pathological user implementations. We now have high confidence that arbitraily buggy user implementations (as long as they're in safe Rust) will not result in undefined behavior.
    Open source →
    Release notes

    Changed

    • The internal implementation for item storage has been changed to use a linear slot-based buffer, resulting in 2-3x performance improvements for most workloads.
    • The maps now have a limit of u32::MAX (4 294 967 295) elements at any given time. This limit is very unlikely to be reached in practice.

    Fixed

    • All mutation methods for IdHashMap and IdOrdMap are now panic-safe, in the sense that a panic in user code will not corrupt the map. This does not currently extend to BiHashMap and TriHashMap

    Added

    • Many more unit and property-based tests covering various kinds of pathological user implementations. We now have high confidence that arbitraily buggy user implementations (as long as they're in safe Rust) will not result in undefined behavior.
    Open source →
  8. 0.3.18 23 Apr 2026
    Release notes

    Fixed

    • Fixed a rehashing bug in hash map reserve and shrink-to-fit methods. (Due to an oversight, these methods were previously not part of our property-based tests. Now they are. Sorry about that!)
    Open source →
    Release notes

    Fixed

    • Fixed a rehashing bug in hash map reserve and shrink-to-fit methods. (Due to an oversight, these methods were previously not part of our property-based tests. Now they are. Sorry about that!)
    Open source →
  9. 0.3.17 22 Nov 2025
    Release notes

    Added

    • Capacity management methods for all map types:
      • reserve(&mut self, additional: usize) reserves capacity for at least additional more elements.
      • shrink_to_fit(&mut self) shrinks capacity to fit the current length.
      • shrink_to(&mut self, min_capacity: usize) shrinks capacity to at least min_capacity.
      • try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError>: fallible capacity reservation for hash maps (IdHashMap, BiHashMap, TriHashMap).
    • New TryReserveError type in the errors module for reporting allocation failures.

    Notes

    • For IdOrdMap, the reserve and shrink methods only affect item storage. The internal BTreeSet used for item ordering does not support capacity control.
    • IdOrdMap does not provide try_reserve, since the underlying BTreeSet does not expose fallible reservation operations.

    Fixed

    • Fixed an instance of potential unsoundness in retain.

    Changed

    The Extend implementations now pre-reserve capacity based on the iterator's size_hint.

    Open source →
    Release notes

    Added

    • Capacity management methods for all map types:
      • reserve(&mut self, additional: usize) reserves capacity for at least additional more elements.
      • shrink_to_fit(&mut self) shrinks capacity to fit the current length.
      • shrink_to(&mut self, min_capacity: usize) shrinks capacity to at least min_capacity.
      • try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError>: fallible capacity reservation for hash maps (IdHashMap, BiHashMap, TriHashMap).
    • New TryReserveError type in the errors module for reporting allocation failures.

    Notes

    • For IdOrdMap, the reserve and shrink methods only affect item storage. The internal BTreeSet used for item ordering does not support capacity control.
    • IdOrdMap does not provide try_reserve, since the underlying BTreeSet does not expose fallible reservation operations.

    Fixed

    • Fixed an instance of potential unsoundness in retain.

    Changed

    The Extend implementations now pre-reserve capacity based on the iterator's size_hint.

    Open source →
  10. 0.3.16 09 Nov 2025
    Release notes

    Added

    • clear methods for all map types to remove all items from the map.
    • Optionally, serialize ID maps as maps (JSON objects) rather than sequences (JSON arrays):
      • New IdHashMapAsMap, BiHashMapAsMap, TriHashMapAsMap, and IdOrdMapAsMap marker types to use with #[serde(with = ...)].
      • The default deserializer for each map now accepts both maps and sequences.

    Changed

    • Documentation improvements for serde implementations.
    Open source →
  11. 0.3.15 09 Nov 2025
    Release notes

    Added

    • retain methods that allow filtering items in place based on a predicate.
    • IdOrdMap::first, first_entry, last, last_entry, pop_first, and pop_last methods for accessing entries at the beginning and end of the map.
    • BiHashMap::with_hasher and TriHashMap::with_hasher are now const fn.

    Changed

    • Reduced memory footprint for BiHashMap and TriHashMap.
    Open source →
  12. 0.3.14 29 Sep 2025
    Release notes

    Fixed

    Replaced obsolete doc_auto_cfg with doc_cfg, to fix Rust nightly builds with the doc_cfg flag enabled.

    Open source →
  13. 0.3.13 15 Sep 2025
    Release notes

    Changed

    • iddqd now depends on serde_core rather than serde. This allows iddqd's compilation to be parallelized with serde_derive.
    • Internal dependency updates: foldhash updated to 0.2, and hashbrown updated to 0.16.
    Open source →
  14. 0.3.12 12 Sep 2025
    Release notes

    Added

    The following methods are now const fn:

    • IdOrdMap::new
    • IdHashMap::with_hasher
    Open source →
  15. 0.3.11 14 Aug 2025
    Release notes

    Fixed

    The type definitions for IdHashMap, BiHashMap, TriHashMap, and IdOrdMap no longer require IdHashItem, BiHashItem, TriHashItem, and IdOrdItem, respectively. This matches the standard library's HashMap and BTreeMap type definitions which don't require Hash + Eq or Ord bounds.

    Thanks to aatifsyed for your first contribution!

    Open source →
  16. 0.3.10 12 Aug 2025
    Release notes

    Fixed

    id_ord_map::RefMut's reborrow method now works if the underlying IdOrdItem is non-'static.

    Open source →
  17. 0.3.9 22 Jul 2025
    Release notes

    Added

    • For the optional daft feature, the map Diff types now implement fmt::Debug.

    Miscellaneous

    • Several documentation fixes.
    Open source →
  18. 0.3.8 23 Jun 2025
    Release notes

    Added

    • New proptest feature adds strategy and Arbitrary implementations for map types.
    Open source →
  19. 0.3.7 11 Jun 2025
    Release notes

    Fixed

    • iddqd is now compatible with schemars's preserve_order feature. Thanks Sh3Rm4n for your first contribution!
    Open source →
  20. 0.3.6 06 Jun 2025
    Release notes

    Changed

    • Relaxed Debug requirement to only require that T::Key<'a>: fmt::Debug, not for<'k> T::Key<'k>: fmt::Debug. This allows items with borrowed data to compile in more cases.
    • Relaxed Hash requirement for IdOrdMap get_mut and related APIs in a similar fashion.
    Open source →
  21. 0.3.5 05 Jun 2025
    Release notes

    Added

    • New feature schemars08 adds support for generating JSON schemas.
    Open source →
  22. 0.3.4 03 Jun 2025
    Release notes

    Added

    • New macros id_hash_map, bi_hash_map, tri_hash_map, and id_ord_map allow easy construction of literal macros. These macros use insert_unique, so they panic if duplicate keys are encountered.

    Changed

    • The id_upcast, bi_upcast and tri_upcast macros now have a Self: 'long bound, allowing them to be used for non-'static items.
    • Minimized dependency list, removing the dependency on derive-where, debug-ignore, and serde's derive feature. iddqd no longer depends on any proc macros.
    Open source →
  23. 0.3.3 27 May 2025
    Release notes

    Added

    • A lot of new documentation. Most functions now have doctests.

    Fixed

    • Serde implementations no longer do internal buffering.
    • Serde implementations now reserve capacity if the size hint is available; thanks @aatifsyed for your first contribution!
    • A few unnecessary bounds have been loosened.
    Open source →
  24. 0.3.2 25 May 2025
    Release notes

    Added

    • The hash map types now support custom hashers.
    • With the new allocator-api2 feature (enabled by default), the hash map types now support custom allocators, including on stable. See the bumpalo-alloc example.
    • Added some documentation explaining iteration order.
    • Added a note in the README and lib.rs that small copyable keys like integers are best returned as owned ones.

    Changed

    • Dropped the Ord requirement for Comparable keys. (The Hash requirement for Equivalent continues to be required.)
    Open source →
  25. 0.3.1 22 May 2025
    Release notes

    Added

    • Re-export equivalent::Equivalent and equivalent::Comparable.
    Open source →
  26. 0.3.0 22 May 2025
    Release notes

    Changed

    • Lookups now use equivalent::Equivalent or equivalent::Comparable, which are strictly more general than Borrow.
    • get_mut and remove methods no longer require the key type; the borrow checker limitation has been worked around.
    Open source →
  27. 0.2.1 22 May 2025
    Release notes

    Fixed

    • MapLeaf<'a, T>'s Clone and Copy no longer require T to be Clone or Copy. (MapLeaf is just a couple of references, so this is never necessary.)
    Open source →
  28. 0.2.0 22 May 2025
    Release notes

    Added

    • Extend implementations.

    Changed

    • Daft implementations for BiHashMap and TriHashMap changed to also allow diffing by individual keys.
    Open source →
  29. 0.1.2 22 May 2025
    Release notes

    Added

    • BiHashMap and TriHashMap now have a remove_unique method which removes an item uniquely indexed by all keys.

    Changed

    • upcast macros are now annotated with #[inline], since they're trivial.
    Open source →
  30. 0.1.1 21 May 2025
    Release notes

    Added

    • Daft implementations with the new daft feature.
    • BiHashItem implementations for reference types like &'a T and Box<T>.
    Open source →
  31. 0.1.0 21 May 2025
    Release notes

    Initial release.

    <!-- next-url --> [0.4.6]: https://github.com/oxidecomputer/iddqd/releases/tag/iddqd-0.4.6 [0.4.5]: https://github.com/oxidecomputer/iddqd/releases/tag/iddqd-0.4.5 [0.4.4]: https://github.com/oxidecomputer/iddqd/releases/tag/iddqd-0.4.4 [0.4.3]: https://github.com/oxidecomputer/iddqd/releases/tag/iddqd-0.4.3 [0.4.2]: https://github.com/oxidecomputer/iddqd/releases/tag/iddqd-0.4.2 [0.4.1]: https://github.com/oxidecomputer/iddqd/releases/tag/iddqd-0.4.1 [0.4.0]: https://github.com/oxidecomputer/iddqd/releases/tag/iddqd-0.4.0 [0.3.18]: https://github.com/oxidecomputer/iddqd/releases/tag/iddqd-0.3.18 [0.3.17]: https://github.com/oxidecomputer/iddqd/releases/tag/iddqd-0.3.17 [0.3.16]: https://github.com/oxidecomputer/iddqd/releases/tag/iddqd-0.3.16 [0.3.15]: https://github.com/oxidecomputer/iddqd/releases/tag/iddqd-0.3.15 [0.3.14]: https://github.com/oxidecomputer/iddqd/releases/tag/iddqd-0.3.14 [0.3.13]: https://github.com/oxidecomputer/iddqd/releases/tag/iddqd-0.3.13 [0.3.12]: https://github.com/oxidecomputer/iddqd/releases/tag/iddqd-0.3.12 [0.3.11]: https://github.com/oxidecomputer/iddqd/releases/tag/iddqd-0.3.11 [0.3.10]: https://github.com/oxidecomputer/iddqd/releases/tag/iddqd-0.3.10 [0.3.9]: https://github.com/oxidecomputer/iddqd/releases/tag/iddqd-0.3.9 [0.3.8]: https://github.com/oxidecomputer/iddqd/releases/tag/iddqd-0.3.8 [0.3.7]: https://github.com/oxidecomputer/iddqd/releases/tag/iddqd-0.3.7 [0.3.6]: https://github.com/oxidecomputer/iddqd/releases/tag/iddqd-0.3.6 [0.3.5]: https://github.com/oxidecomputer/iddqd/releases/tag/iddqd-0.3.5 [0.3.4]: https://github.com/oxidecomputer/iddqd/releases/tag/iddqd-0.3.4 [0.3.3]: https://github.com/oxidecomputer/iddqd/releases/tag/iddqd-0.3.3 [0.3.2]: https://github.com/oxidecomputer/iddqd/releases/tag/iddqd-0.3.2 [0.3.1]: https://github.com/oxidecomputer/iddqd/releases/tag/iddqd-0.3.1 [0.3.0]: https://github.com/oxidecomputer/iddqd/releases/tag/iddqd-0.3.0 [0.2.1]: https://github.com/oxidecomputer/iddqd/releases/tag/iddqd-0.2.1 [0.2.0]: https://github.com/oxidecomputer/iddqd/releases/tag/iddqd-0.2.0 [0.1.2]: https://github.com/oxidecomputer/iddqd/releases/tag/iddqd-0.1.2 [0.1.1]: https://github.com/oxidecomputer/iddqd/releases/tag/iddqd-0.1.1 [0.1.0]: https://github.com/oxidecomputer/iddqd/releases/tag/iddqd-0.1.0

    Open source →

Every package, every release, already written down.

The archive is open and free. Watching your own project is what we are building next.

Browse the archive