core::hash::Hash - Rust
Description: API documentation for the Rust `Hash` trait in crate `core`.
Keywords: rust, rustlang, rust-lang, Hash

# Trait core::hash::Hash 1.0.0[−][src]

    pub trait Hash {
        fn hash<H: Hasher>(&self, state: &mut H);

        fn hash_slice<H: Hasher>(data: &[Self], state: &mut H)
        where
            Self: Sized,
        { ... }
    }

A hashable type.

Types implementing `Hash` are able to be `hash`ed with an instance of `Hasher`.

## Implementing `Hash`

You can derive `Hash` with `#[derive(Hash)]` if all fields implement `Hash`. The resulting hash will be the combination of the values from calling `hash` on each field.

    #[derive(Hash)]
    struct Rustacean {
        name: String,
        country: String,
    }Run

If you need more control over how a value is hashed, you can of course implement the `Hash` trait yourself:

    use std::hash::{Hash, Hasher};

    struct Person {
        id: u32,
        name: String,
        phone: u64,
    }

    impl Hash for Person {
        fn hash<H: Hasher>(&self, state: &mut H) {
            self.id.hash(state);
            self.phone.hash(state);
        }
    }Run

## `Hash` and `Eq`

When implementing both `Hash` and `Eq`, it is important that the following property holds:

    k1 == k2 -> hash(k1) == hash(k2)

In other words, if two keys are equal, their hashes must also be equal. `HashMap` and `HashSet` both rely on this behavior.

Thankfully, you won't need to worry about upholding this property when deriving both `Eq` and `Hash` with `#[derive(PartialEq, Eq, Hash)]`.

## Required Methods

### `fn hash<H: Hasher>(&self, state: &mut H)`

Feeds this value into the given `Hasher`.

# Examples

    use std::collections::hash_map::DefaultHasher;
    use std::hash::{Hash, Hasher};

    let mut hasher = DefaultHasher::new();
    7920.hash(&mut hasher);
    println!("Hash is {:x}!", hasher.finish());Run

## Provided Methods

### `fn hash_slice<H: Hasher>(data: &[Self], state: &mut H) where
Self: Sized,`
1.3.0

Feeds a slice of this type into the given `Hasher`.

# Examples

    use std::collections::hash_map::DefaultHasher;
    use std::hash::{Hash, Hasher};

    let mut hasher = DefaultHasher::new();
    let numbers = [6, 28, 496, 8128];
    Hash::hash_slice(&numbers, &mut hasher);
    println!("Hash is {:x}!", hasher.finish());Run

## Implementors

- `impl Hash for NonZeroU8` | [src]

- `impl Hash for NonZeroU16` | [src]

- `impl Hash for NonZeroU32` | [src]

- `impl Hash for NonZeroU64` | [src]

- `impl Hash for NonZeroU128` | [src]

- `impl Hash for NonZeroUsize` | [src]

- `impl<T: Hash> Hash for Wrapping<T>` | [src]

- `impl<T> Hash for Discriminant<T>` | [src]

- `impl<T: Hash> Hash for ManuallyDrop<T>` | [src]

- `impl<Ret> Hash for fn() -> Ret` | [src]

- `impl<Ret> Hash for extern "C" fn() -> Ret` | [src]

- `impl<Ret> Hash for unsafe fn() -> Ret` | [src]

- `impl<Ret> Hash for unsafe extern "C" fn() -> Ret` | [src]

- `impl<Ret, A> Hash for fn(_: A) -> Ret` | [src]

- `impl<Ret, A> Hash for extern "C" fn(_: A) -> Ret` | [src]

- `impl<Ret, A> Hash for extern "C" fn(_: A, ...) -> Ret` | [src]

- `impl<Ret, A> Hash for unsafe fn(_: A) -> Ret` | [src]

- `impl<Ret, A> Hash for unsafe extern "C" fn(_: A) -> Ret` | [src]

- `impl<Ret, A> Hash for unsafe extern "C" fn(_: A, ...) -> Ret` | [src]

- `impl<Ret, A, B> Hash for fn(_: A, _: B) -> Ret` | [src]

- `impl<Ret, A, B> Hash for extern "C" fn(_: A, _: B) -> Ret` | [src]

- `impl<Ret, A, B> Hash for extern "C" fn(_: A, _: B, ...) -> Ret` | [src]

- `impl<Ret, A, B> Hash for unsafe fn(_: A, _: B) -> Ret` | [src]

- `impl<Ret, A, B> Hash for unsafe extern "C" fn(_: A, _: B) -> Ret` | [src]

- `impl<Ret, A, B> Hash for unsafe extern "C" fn(_: A, _: B, ...) -> Ret` | [src]

- `impl<Ret, A, B, C> Hash for fn(_: A, _: B, _: C) -> Ret` | [src]

- `impl<Ret, A, B, C> Hash for extern "C" fn(_: A, _: B, _: C) -> Ret` | [src]

- `impl<Ret, A, B, C> Hash for extern "C" fn(_: A, _: B, _: C, ...) -> Ret` | [src]

- `impl<Ret, A, B, C> Hash for unsafe fn(_: A, _: B, _: C) -> Ret` | [src]

- `impl<Ret, A, B, C> Hash for unsafe extern "C" fn(_: A, _: B, _: C) -> Ret` | [src]

- `impl<Ret, A, B, C> Hash for unsafe extern "C" fn(_: A, _: B, _: C, ...) -> Ret` | [src]

- `impl<Ret, A, B, C, D> Hash for fn(_: A, _: B, _: C, _: D) -> Ret` | [src]

- `impl<Ret, A, B, C, D> Hash for extern "C" fn(_: A, _: B, _: C, _: D) -> Ret` | [src]

- `impl<Ret, A, B, C, D> Hash for extern "C" fn(_: A, _: B, _: C, _: D, ...) -> Ret` | [src]

- `impl<Ret, A, B, C, D> Hash for unsafe fn(_: A, _: B, _: C, _: D) -> Ret` | [src]

- `impl<Ret, A, B, C, D> Hash for unsafe extern "C" fn(_: A, _: B, _: C, _: D) -> Ret` | [src]

- `impl<Ret, A, B, C, D> Hash for unsafe extern "C" fn(_: A, _: B, _: C, _: D, ...) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E> Hash for fn(_: A, _: B, _: C, _: D, _: E) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E> Hash for extern "C" fn(_: A, _: B, _: C, _: D, _: E) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E> Hash for extern "C" fn(_: A, _: B, _: C, _: D, _: E, ...) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E> Hash for unsafe fn(_: A, _: B, _: C, _: D, _: E) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E> Hash for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E> Hash for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, ...) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F> Hash for fn(_: A, _: B, _: C, _: D, _: E, _: F) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F> Hash for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F> Hash for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, ...) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F> Hash for unsafe fn(_: A, _: B, _: C, _: D, _: E, _: F) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F> Hash for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F> Hash for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, ...) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G> Hash for fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G> Hash for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G> Hash for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, ...) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G> Hash for unsafe fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G> Hash for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G> Hash for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, ...) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G, H> Hash for fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G, H> Hash for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G, H> Hash for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, ...) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G, H> Hash for unsafe fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G, H> Hash for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G, H> Hash for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, ...) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G, H, I> Hash for fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G, H, I> Hash for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G, H, I> Hash for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, ...) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G, H, I> Hash for unsafe fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G, H, I> Hash for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G, H, I> Hash for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, ...) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G, H, I, J> Hash for fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G, H, I, J> Hash for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G, H, I, J> Hash for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, ...) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G, H, I, J> Hash for unsafe fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G, H, I, J> Hash for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G, H, I, J> Hash for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, ...) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G, H, I, J, K> Hash for fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, _: K) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G, H, I, J, K> Hash for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, _: K) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G, H, I, J, K> Hash for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, _: K, ...) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G, H, I, J, K> Hash for unsafe fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, _: K) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G, H, I, J, K> Hash for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, _: K) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G, H, I, J, K> Hash for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, _: K, ...) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G, H, I, J, K, L> Hash for fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, _: K, _: L) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G, H, I, J, K, L> Hash for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, _: K, _: L) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G, H, I, J, K, L> Hash for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, _: K, _: L, ...) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G, H, I, J, K, L> Hash for unsafe fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, _: K, _: L) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G, H, I, J, K, L> Hash for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, _: K, _: L) -> Ret` | [src]

- `impl<Ret, A, B, C, D, E, F, G, H, I, J, K, L> Hash for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, _: K, _: L, ...) -> Ret` | [src]

- `impl<T: ?Sized> Hash for NonNull<T>` | [src]

- `impl<T: ?Sized> Hash for PhantomData<T>` | [src]

- `impl Hash for Pinned` | [src]

- `impl<Y: Hash, R: Hash> Hash for GeneratorState<Y, R>` | [src]

- `impl Hash for RangeFull` | [src]

- `impl<Idx: Hash> Hash for Range<Idx>` | [src]

- `impl<Idx: Hash> Hash for RangeFrom<Idx>` | [src]

- `impl<Idx: Hash> Hash for RangeTo<Idx>` | [src]

- `impl<Idx: Hash> Hash for RangeInclusive<Idx>` | [src]

- `impl<Idx: Hash> Hash for RangeToInclusive<Idx>` | [src]

- `impl<T: Hash> Hash for Bound<T>` | [src]

- `impl Hash for Ordering` | [src]

- `impl<T: Hash> Hash for Reverse<T>` | [src]

- `impl Hash for TypeId` | [src]

- `impl<T: Hash> Hash for [T; 0]` | [src]

- `impl<T: Hash> Hash for [T; 1]` | [src]

- `impl<T: Hash> Hash for [T; 2]` | [src]

- `impl<T: Hash> Hash for [T; 3]` | [src]

- `impl<T: Hash> Hash for [T; 4]` | [src]

- `impl<T: Hash> Hash for [T; 5]` | [src]

- `impl<T: Hash> Hash for [T; 6]` | [src]

- `impl<T: Hash> Hash for [T; 7]` | [src]

- `impl<T: Hash> Hash for [T; 8]` | [src]

- `impl<T: Hash> Hash for [T; 9]` | [src]

- `impl<T: Hash> Hash for [T; 10]` | [src]

- `impl<T: Hash> Hash for [T; 11]` | [src]

- `impl<T: Hash> Hash for [T; 12]` | [src]

- `impl<T: Hash> Hash for [T; 13]` | [src]

- `impl<T: Hash> Hash for [T; 14]` | [src]

- `impl<T: Hash> Hash for [T; 15]` | [src]

- `impl<T: Hash> Hash for [T; 16]` | [src]

- `impl<T: Hash> Hash for [T; 17]` | [src]

- `impl<T: Hash> Hash for [T; 18]` | [src]

- `impl<T: Hash> Hash for [T; 19]` | [src]

- `impl<T: Hash> Hash for [T; 20]` | [src]

- `impl<T: Hash> Hash for [T; 21]` | [src]

- `impl<T: Hash> Hash for [T; 22]` | [src]

- `impl<T: Hash> Hash for [T; 23]` | [src]

- `impl<T: Hash> Hash for [T; 24]` | [src]

- `impl<T: Hash> Hash for [T; 25]` | [src]

- `impl<T: Hash> Hash for [T; 26]` | [src]

- `impl<T: Hash> Hash for [T; 27]` | [src]

- `impl<T: Hash> Hash for [T; 28]` | [src]

- `impl<T: Hash> Hash for [T; 29]` | [src]

- `impl<T: Hash> Hash for [T; 30]` | [src]

- `impl<T: Hash> Hash for [T; 31]` | [src]

- `impl<T: Hash> Hash for [T; 32]` | [src]

- `impl<T: Hash> Hash for Option<T>` | [src]

- `impl Hash for NoneError` | [src]

- `impl<T: Hash, E: Hash> Hash for Result<T, E>` | [src]

- `impl Hash for u8` | [src]

- `impl Hash for u16` | [src]

- `impl Hash for u32` | [src]

- `impl Hash for u64` | [src]

- `impl Hash for usize` | [src]

- `impl Hash for i8` | [src]

- `impl Hash for i16` | [src]

- `impl Hash for i32` | [src]

- `impl Hash for i64` | [src]

- `impl Hash for isize` | [src]

- `impl Hash for u128` | [src]

- `impl Hash for i128` | [src]

- `impl Hash for bool` | [src]

- `impl Hash for char` | [src]

- `impl Hash for str` | [src]

- `impl Hash for !` | [src]

- `impl Hash for ()` | [src]

- `impl<A> Hash for (A,) where A: Hash + ?Sized,` | [src]

- `impl<A: Hash, B> Hash for (A, B) where B: Hash + ?Sized,` | [src]

- `impl<A: Hash, B: Hash, C> Hash for (A, B, C) where C: Hash + ?Sized,` | [src]

- `impl<A: Hash, B: Hash, C: Hash, D> Hash for (A, B, C, D) where D: Hash + ?Sized,` | [src]

- `impl<A: Hash, B: Hash, C: Hash, D: Hash, E> Hash for (A, B, C, D, E) where E: Hash + ?Sized,` | [src]

- `impl<A: Hash, B: Hash, C: Hash, D: Hash, E: Hash, F> Hash for (A, B, C, D, E, F) where F: Hash + ?Sized,` | [src]

- `impl<A: Hash, B: Hash, C: Hash, D: Hash, E: Hash, F: Hash, G> Hash for (A, B, C, D, E, F, G) where G: Hash + ?Sized,` | [src]

- `impl<A: Hash, B: Hash, C: Hash, D: Hash, E: Hash, F: Hash, G: Hash, H> Hash for (A, B, C, D, E, F, G, H) where H: Hash + ?Sized,` | [src]

- `impl<A: Hash, B: Hash, C: Hash, D: Hash, E: Hash, F: Hash, G: Hash, H: Hash, I> Hash for (A, B, C, D, E, F, G, H, I) where I: Hash + ?Sized,` | [src]

- `impl<A: Hash, B: Hash, C: Hash, D: Hash, E: Hash, F: Hash, G: Hash, H: Hash, I: Hash, J> Hash for (A, B, C, D, E, F, G, H, I, J) where J: Hash + ?Sized,` | [src]

- `impl<A: Hash, B: Hash, C: Hash, D: Hash, E: Hash, F: Hash, G: Hash, H: Hash, I: Hash, J: Hash, K> Hash for (A, B, C, D, E, F, G, H, I, J, K) where K: Hash + ?Sized,` | [src]

- `impl<A: Hash, B: Hash, C: Hash, D: Hash, E: Hash, F: Hash, G: Hash, H: Hash, I: Hash, J: Hash, K: Hash, L> Hash for (A, B, C, D, E, F, G, H, I, J, K, L) where L: Hash + ?Sized,` | [src]

- `impl<T: Hash> Hash for [T]` | [src]

- `impl<'a, T: ?Sized + Hash> Hash for &'a T` | [src]

- `impl<'a, T: ?Sized + Hash> Hash for &'a mut T` | [src]

- `impl<T: ?Sized> Hash for *const T` | [src]

- `impl<T: ?Sized> Hash for *mut T` | [src]

- `impl Hash for Error` | [src]

- `impl Hash for Duration` | [src]

- `impl<T: Hash> Hash for Poll<T>` | [src]

# Help

## Keyboard Shortcuts

`?`
  Show this help dialog
`S`
  Focus the search field
`↑`
  Move up in search results
`↓`
  Move down in search results
`↹`
  Switch tab
`⏎`
  Go to active search result
`+`
  Expand all sections
`-`
  Collapse all sections

## Search Tricks

Prefix searches with a type followed by a colon (e.g. `fn:`) to restrict the search to a given type.

Accepted types are: `fn`, `mod`, `struct`, `enum`, `trait`, `type`, `macro`, and `const`.

Search functions by type signature (e.g. `vec -> usize` or `* -> vec`)

Search multiple things at once by splitting your query with comma (e.g. `str,u8` or `String,struct:Vec,test`)