Expand description
A hashable type.
Types implementing Hash are able to be hashed with an instance of
Hasher.
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,
}
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);
}
}
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)].
Feeds this value into the given Hasher.
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());
Feeds a slice of this type into the given Hasher.
This method is meant as a convenience, but its implementation is
also explicitly left unspecified. It isn’t guaranteed to be
equivalent to repeated calls of hash and implementations of
Hash should keep that in mind and call hash themselves
if the slice isn’t treated as a whole unit in the PartialEq
implementation.
For example, a VecDeque implementation might naïvely call
as_slices and then hash_slice on each slice, but this
is wrong since the two slices can change with a call to
make_contiguous without affecting the PartialEq
result. Since these slices aren’t treated as singular
units, and instead part of a larger deque, this method cannot
be used.
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());
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
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
impl<Ret, A, B, C, D, E, F, G, H> Hash for fn(A, B, C, D, E, F, G, H) -> Ret
impl<A, B, C, D, E, F, G, H, I, J, K, L> Hash for (A, B, C, D, E, F, G, H, I, J, K, L) where
C: Hash,
L: Hash + ?Sized,
A: Hash,
B: Hash,
D: Hash,
E: Hash,
F: Hash,
G: Hash,
I: Hash,
H: Hash,
K: Hash,
J: Hash,
impl<Ret, A, B, C, D> Hash for fn(A, B, C, D) -> Ret
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
impl<Ret, A> Hash for unsafe fn(A) -> Ret
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
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
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
impl<Ret, A, B, C, D> Hash for extern "C" fn(A, B, C, D) -> Ret
impl<Ret, A, B> Hash for unsafe fn(A, B) -> Ret
impl<A, B, C, D, E, F, G, H> Hash for (A, B, C, D, E, F, G, H) where
C: Hash,
A: Hash,
B: Hash,
D: Hash,
E: Hash,
F: Hash,
G: Hash,
H: Hash + ?Sized,
impl<Ret, A, B, C, D, E> Hash for unsafe extern "C" fn(A, B, C, D, E) -> Ret
impl<Ret, A, B, C, D, E, F, G> Hash for extern "C" fn(A, B, C, D, E, F, G, ...) -> Ret
impl<Ret, A, B, C, D, E> Hash for extern "C" fn(A, B, C, D, E) -> Ret
impl<Ret, A, B> Hash for extern "C" fn(A, B, ...) -> Ret
impl<Ret, A, B> Hash for extern "C" fn(A, B) -> Ret
impl<Ret, A, B, C, D, E> Hash for unsafe fn(A, B, C, D, E) -> Ret
impl<Ret, A, B, C> Hash for unsafe fn(A, B, C) -> Ret
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
impl<Ret, A, B, C, D> Hash for unsafe extern "C" fn(A, B, C, D) -> Ret
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
impl<Ret, A> Hash for unsafe extern "C" fn(A, ...) -> Ret
impl<Ret, A, B, C, D, E, F> Hash for unsafe extern "C" fn(A, B, C, D, E, F, ...) -> Ret
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
impl<Ret, A> Hash for unsafe extern "C" fn(A) -> Ret
impl<Ret, A, B, C, D, E, F> Hash for extern "C" fn(A, B, C, D, E, F) -> Ret
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
impl<Ret, A, B, C> Hash for extern "C" fn(A, B, C, ...) -> Ret
impl<Ret> Hash for unsafe extern "C" fn() -> Ret
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
impl<Ret, A, B, C> Hash for unsafe extern "C" fn(A, B, C) -> Ret
impl<Ret> Hash for unsafe fn() -> Ret
impl<Ret, A, B, C, D, E> Hash for extern "C" fn(A, B, C, D, E, ...) -> Ret
impl<Ret, A, B> Hash for unsafe extern "C" fn(A, B) -> Ret
impl<Ret, A, B, C, D, E, F, G> Hash for extern "C" fn(A, B, C, D, E, F, G) -> Ret
impl<Ret, A, B, C, D, E, F, G, H, I> Hash for fn(A, B, C, D, E, F, G, H, I) -> Ret
impl<Ret, A, B, C> Hash for fn(A, B, C) -> Ret
impl<Ret, A, B, C, D, E, F> Hash for extern "C" fn(A, B, C, D, E, F, ...) -> Ret
impl<A, B, C, D, E, F> Hash for (A, B, C, D, E, F) where
C: Hash,
A: Hash,
B: Hash,
D: Hash,
E: Hash,
F: Hash + ?Sized,
impl<A, B, C, D, E, F, G, H, I, J, K> Hash for (A, B, C, D, E, F, G, H, I, J, K) where
C: Hash,
A: Hash,
B: Hash,
D: Hash,
E: Hash,
F: Hash,
G: Hash,
I: Hash,
H: Hash,
K: Hash + ?Sized,
J: Hash,
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
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
impl<Ret, A, B, C, D, E, F, G> Hash for fn(A, B, C, D, E, F, G) -> Ret
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
impl<Ret, A, B> Hash for unsafe extern "C" fn(A, B, ...) -> Ret
impl<Ret, A, B, C, D> Hash for extern "C" fn(A, B, C, D, ...) -> Ret
The hash of an array is the same as that of the corresponding slice,
as required by the Borrow implementation.
#![feature(build_hasher_simple_hash_one)]
use std::hash::BuildHasher;
let b = std::collections::hash_map::RandomState::new();
let a: [u8; 3] = [0xa8, 0x3c, 0x09];
let s: &[u8] = &[0xa8, 0x3c, 0x09];
assert_eq!(b.hash_one(a), b.hash_one(s));
impl<A, B, C, D, E> Hash for (A, B, C, D, E) where
C: Hash,
A: Hash,
B: Hash,
D: Hash,
E: Hash + ?Sized,
impl<A, B, C, D, E, F, G, H, I> Hash for (A, B, C, D, E, F, G, H, I) where
C: Hash,
A: Hash,
B: Hash,
D: Hash,
E: Hash,
F: Hash,
G: Hash,
I: Hash + ?Sized,
H: Hash,
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
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
impl<Ret, A, B, C, D, E, F, G, H> Hash for extern "C" fn(A, B, C, D, E, F, G, H) -> Ret
impl<Ret, A, B, C, D, E, F> Hash for fn(A, B, C, D, E, F) -> Ret
impl<Ret, A> Hash for extern "C" fn(A) -> Ret
impl<Ret, A> Hash for fn(A) -> Ret
impl<Ret, A, B, C, D, E> Hash for fn(A, B, C, D, E) -> Ret
impl<Ret, A, B, C> Hash for unsafe extern "C" fn(A, B, C, ...) -> Ret
impl<Ret, A, B, C, D, E> Hash for unsafe extern "C" fn(A, B, C, D, E, ...) -> Ret
impl<Ret, A> Hash for extern "C" fn(A, ...) -> Ret
impl<A, B, C, D> Hash for (A, B, C, D) where
C: Hash,
A: Hash,
B: Hash,
D: Hash + ?Sized,
impl<Ret, A, B, C, D, E, F, G> Hash for unsafe extern "C" fn(A, B, C, D, E, F, G, ...) -> Ret
impl<A, B, C, D, E, F, G> Hash for (A, B, C, D, E, F, G) where
C: Hash,
A: Hash,
B: Hash,
D: Hash,
E: Hash,
F: Hash,
G: Hash + ?Sized,
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
impl<Ret, A, B, C, D, E, F, G> Hash for unsafe extern "C" fn(A, B, C, D, E, F, G) -> Ret
impl<Ret> Hash for extern "C" fn() -> Ret
impl<Ret, A, B, C, D, E, F> Hash for unsafe fn(A, B, C, D, E, F) -> Ret
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
impl<Ret, A, B, C, D, E, F, G, H> Hash for extern "C" fn(A, B, C, D, E, F, G, H, ...) -> Ret
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
impl<Ret, A, B, C, D> Hash for unsafe extern "C" fn(A, B, C, D, ...) -> Ret
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
impl<Ret, A, B, C, D> Hash for unsafe fn(A, B, C, D) -> Ret
impl<Ret, A, B, C, D, E, F, G> Hash for unsafe fn(A, B, C, D, E, F, G) -> Ret
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
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
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
impl<Ret, A, B, C, D, E, F> Hash for unsafe extern "C" fn(A, B, C, D, E, F) -> Ret
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
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
impl<Ret> Hash for fn() -> Ret
impl<Ret, A, B> Hash for fn(A, B) -> Ret
impl<Ret, A, B, C, D, E, F, G, H> Hash for unsafe fn(A, B, C, D, E, F, G, H) -> Ret
impl<A, B, C, D, E, F, G, H, I, J> Hash for (A, B, C, D, E, F, G, H, I, J) where
C: Hash,
A: Hash,
B: Hash,
D: Hash,
E: Hash,
F: Hash,
G: Hash,
I: Hash,
H: Hash,
J: Hash + ?Sized,
impl<Ret, A, B, C> Hash for extern "C" fn(A, B, C) -> Ret
The hash of a vector is the same as that of the corresponding slice,
as required by the core::borrow::Borrow implementation.
#![feature(build_hasher_simple_hash_one)]
use std::hash::BuildHasher;
let b = std::collections::hash_map::RandomState::new();
let v: Vec<u8> = vec![0xa8, 0x3c, 0x09];
let s: &[u8] = &[0xa8, 0x3c, 0x09];
assert_eq!(b.hash_one(v), b.hash_one(s));
impl Hash for WaylandHandle
impl Hash for RawWindowHandle
impl Hash for AnyExtension
impl Hash for LittleEndian
impl Hash for SpecialOptions
impl Hash for MatchingType
impl Hash for Compression
impl Hash for CompressionOptions
impl Hash for StreamResult
impl Hash for TINFLStatus
impl Hash for CompressionStrategy
impl Hash for CompressionLevel
impl Hash for TDEFLStatus
impl Hash for PodCastError
impl<T> Hash for CachePadded<T> where
T: Hash,
impl<T, R, C, S> Hash for Matrix<T, R, C, S> where
C: Dim,
S: Storage<T, R, C>,
T: Scalar + Hash,
R: Dim,
impl<U> Hash for PInt<U> where
U: Hash + Unsigned + NonZero,
impl<U> Hash for NInt<U> where
U: Hash + Unsigned + NonZero,
impl Hash for ZSTD_ResetDirective
impl Hash for ZSTD_strategy
impl Hash for ZSTD_cParameter
impl Hash for ZSTD_dParameter
impl Hash for ZSTD_EndDirective
impl<T> Hash for UnitOffset<T> where
T: Hash,
impl<T> Hash for DebugInfoOffset<T> where
T: Hash,
impl<T> Hash for EhFrameOffset<T> where
T: Hash,
impl<T> Hash for UnitSectionOffset<T> where
T: Hash,
impl Hash for DebugTypeSignature
impl<T> Hash for DebugAbbrevOffset<T> where
T: Hash,
impl<T> Hash for DebugFrameOffset<T> where
T: Hash,
impl Hash for RunTimeEndian
impl Hash for LittleEndian
impl<T> Hash for DebugMacroOffset<T> where
T: Hash,
impl<T> Hash for DebugMacinfoOffset<T> where
T: Hash,
impl<R> Hash for LocationListEntry<R> where
R: Hash + Reader,
impl Hash for LineEncoding
impl<T> Hash for LocationListsOffset<T> where
T: Hash,
impl<T> Hash for DebugTypesOffset<T> where
T: Hash,
impl Hash for DwDefaulted
impl<R> Hash for Expression<R> where
R: Hash + Reader,
impl<T> Hash for RangeListsOffset<T> where
T: Hash,
impl Hash for DwVirtuality
impl Hash for AddressSize
impl<E> Hash for I32Bytes<E> where
E: Hash + Endian,
impl<Section> Hash for SymbolFlags<Section> where
Section: Hash,
impl Hash for CompressedFileRange
impl<'data> Hash for SymbolMapName<'data>
impl Hash for SectionFlags
impl Hash for RelocationEncoding
impl Hash for SymbolIndex
impl Hash for ArchiveKind
impl Hash for Architecture
impl Hash for RelocationTarget
impl<E> Hash for U64Bytes<E> where
E: Hash + Endian,
impl Hash for SymbolSection
impl<'data> Hash for ObjectMapEntry<'data>
impl<E> Hash for I64Bytes<E> where
E: Hash + Endian,
impl Hash for SectionIndex
impl<E> Hash for U32Bytes<E> where
E: Hash + Endian,
impl Hash for SymbolScope
impl Hash for SectionKind
impl<'data> Hash for CompressedData<'data>
impl Hash for LittleEndian
impl Hash for RelocationKind
impl<E> Hash for U16Bytes<E> where
E: Hash + Endian,
impl<E> Hash for I16Bytes<E> where
E: Hash + Endian,
impl Hash for CompressionLevel
impl Hash for TDEFLStatus
impl Hash for StreamResult
impl Hash for TINFLStatus
impl Hash for CompressionStrategy
impl Hash for grafix_toolbox::uses::fmt::Errorimpl<Idx> Hash for grafix_toolbox::uses::ops::Range<Idx> where
Idx: Hash,