dyn-hash

Crates.iodyn-hash
lib.rsdyn-hash
version0.2.0
sourcesrc
created_at2023-11-03 02:00:01.94105
updated_at2024-03-23 05:25:45.300798
descriptionHash trait that is object-safe
homepage
repositoryhttps://github.com/dtolnay/dyn-hash
max_upload_size
id1023785
size24,387
Lanthanum (github:zxtn:lanthanum)

documentation

https://docs.rs/dyn-hash

README

Hash trait that is object-safe

github crates.io docs.rs build status

This crate provides a DynHash trait that can be used in trait objects. Types that implement the standard library's std::hash::Hash trait are automatically usable by a DynHash trait object.

Example

use dyn_hash::DynHash;

trait MyTrait: DynHash {
    /* ... */
}

// Implement std::hash::Hash for dyn MyTrait
dyn_hash::hash_trait_object!(MyTrait);

// Now data structures containing Box<dyn MyTrait> can derive Hash:
#[derive(Hash)]
struct Container {
    trait_object: Box<dyn MyTrait>,
}

Without the dyn-hash crate, a trait trait MyTrait: std::hash::Hash {...} would not be object-safe (dyn MyTrait).

error[E0038]: the trait `MyTrait` cannot be made into an object
 --> src/main.rs:7:12
  |
7 |     let _: &dyn MyTrait;
  |            ^^^^^^^^^^^^ `MyTrait` cannot be made into an object
  |
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
 --> $SYSROOT/lib/rustlib/src/rust/library/core/src/hash/mod.rs
  |
  |     fn hash<H: Hasher>(&self, state: &mut H);
  |        ^^^^ ...because method `hash` has generic type parameters

License

Licensed under either of Apache License, Version 2.0 or MIT license at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this crate by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
Commit count: 43

cargo fmt