Hash trait that is object-safe
==============================
[](https://github.com/dtolnay/dyn-hash)
[](https://crates.io/crates/dyn-hash)
[](https://docs.rs/dyn-hash)
[](https://github.com/dtolnay/dyn-hash/actions?query=branch%3Amaster)
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.
[`std::hash::Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html
## Example
```rust
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 can derive Hash:
#[derive(Hash)]
struct Container {
trait_object: Box,
}
```
Without the dyn-hash crate, a trait `trait MyTrait: std::hash::Hash {...}` would
not be object-safe (`dyn MyTrait`).
```console
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
--> $SYSROOT/lib/rustlib/src/rust/library/core/src/hash/mod.rs
|
| fn hash(&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.