Skip to main content

Hash

Trait Hash 

1.6.0 ยท Source
pub trait Hash: PointeeSized {
    // Required method
    fn hash<H: Hasher>(&self, state: &mut H);

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

A hashable type.

Types implementing Hash are able to be hashed 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,
}

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);
    }
}

ยง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)].

Violating this property is a logic error. The behavior resulting from a logic error is not specified, but users of the trait must ensure that such logic errors do not result in undefined behavior. This means that unsafe code must not rely on the correctness of these methods.

ยงPrefix collisions

Implementations of hash should ensure that the data they pass to the Hasher are prefix-free. That is, values which are not equal should cause two different sequences of values to be written, and neither of the two sequences should be a prefix of the other.

For example, the standard implementation of Hash for &str passes an extra 0xFF byte to the Hasher so that the values ("ab", "c") and ("a", "bc") hash differently.

ยงPortability

Due to differences in endianness and type sizes, data fed by Hash to a Hasher should not be considered portable across platforms. Additionally the data passed by most standard library types should not be considered stable between compiler versions.

This means tests shouldnโ€™t probe hard-coded hash values or data fed to a Hasher and instead should check consistency with Eq.

Serialization formats intended to be portable between platforms or compiler versions should either avoid encoding hashes or only rely on Hash and Hasher implementations that provide additional guarantees.

Required Methodsยง

1.0.0 ยท Source

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

Feeds this value into the given Hasher.

ยงExamples
use std::hash::{DefaultHasher, Hash, Hasher};

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

Provided Methodsยง

1.3.0 ยท Source

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

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.

ยงExamples
use std::hash::{DefaultHasher, 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());

Dyn Compatibilityยง

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety".

Implementorsยง

1.29.0 ยท Sourceยง

impl Hash for !

1.0.0 ยท Sourceยง

impl Hash for ()

Sourceยง

impl Hash for Alignment

Sourceยง

impl Hash for AsciiChar

Sourceยง

impl Hash for ByteStr

1.64.0 ยท Sourceยง

impl Hash for CStr

Sourceยง

impl Hash for CharCase

1.3.0 ยท Sourceยง

impl Hash for Duration

1.0.0 ยท Sourceยง

impl Hash for Error

1.0.0 ยท Sourceยง

impl Hash for ErrorKind

Sourceยง

impl Hash for FieldId

1.44.0 ยท Sourceยง

impl Hash for Infallible

1.55.0 ยท Sourceยง

impl Hash for IntErrorKind

1.7.0 ยท Sourceยง

impl Hash for IpAddr

1.0.0 ยท Sourceยง

impl Hash for Ipv4Addr

1.0.0 ยท Sourceยง

impl Hash for Ipv6Addr

Sourceยง

impl Hash for Ipv6MulticastScope

1.28.0 ยท Sourceยง

impl Hash for Layout

Sourceยง

impl Hash for Locality

1.10.0 ยท Sourceยง

impl Hash for Location<'_>

1.0.0 ยท Sourceยง

impl Hash for core::cmp::Ordering

1.0.0 ยท Sourceยง

impl Hash for core::sync::atomic::Ordering

1.33.0 ยท Sourceยง

impl Hash for PhantomPinned

1.0.0 ยท Sourceยง

impl Hash for RangeFull

1.0.0 ยท Sourceยง

impl Hash for SocketAddr

1.0.0 ยท Sourceยง

impl Hash for SocketAddrV4

1.0.0 ยท Sourceยง

impl Hash for SocketAddrV6

1.0.0 ยท Sourceยง

impl Hash for TypeId

1.0.0 ยท Sourceยง

impl Hash for bool

1.0.0 ยท Sourceยง

impl Hash for char

1.0.0 ยท Sourceยง

impl Hash for i8

1.0.0 ยท Sourceยง

impl Hash for i16

1.0.0 ยท Sourceยง

impl Hash for i32

1.0.0 ยท Sourceยง

impl Hash for i64

1.0.0 ยท Sourceยง

impl Hash for i128

1.0.0 ยท Sourceยง

impl Hash for isize

1.0.0 ยท Sourceยง

impl Hash for str

1.0.0 ยท Sourceยง

impl Hash for u8

1.0.0 ยท Sourceยง

impl Hash for u16

1.0.0 ยท Sourceยง

impl Hash for u32

1.0.0 ยท Sourceยง

impl Hash for u64

1.0.0 ยท Sourceยง

impl Hash for u128

1.0.0 ยท Sourceยง

impl Hash for usize

Sourceยง

impl<'a> Hash for PhantomContravariantLifetime<'a>

Sourceยง

impl<'a> Hash for PhantomCovariantLifetime<'a>

Sourceยง

impl<'a> Hash for PhantomInvariantLifetime<'a>

1.55.0 ยท Sourceยง

impl<B: Hash, C: Hash> Hash for ControlFlow<B, C>

Sourceยง

impl<Dyn: PointeeSized> Hash for DynMetadata<Dyn>

1.4.0 ยท Sourceยง

impl<F: FnPtr> Hash for F

1.0.0 ยท Sourceยง

impl<Idx: Hash> Hash for core::ops::Range<Idx>

1.96.0 ยท Sourceยง

impl<Idx: Hash> Hash for core::range::Range<Idx>

1.0.0 ยท Sourceยง

impl<Idx: Hash> Hash for core::ops::RangeFrom<Idx>

1.96.0 ยท Sourceยง

impl<Idx: Hash> Hash for core::range::RangeFrom<Idx>

1.26.0 ยท Sourceยง

impl<Idx: Hash> Hash for core::ops::RangeInclusive<Idx>

1.95.0 ยท Sourceยง

impl<Idx: Hash> Hash for core::range::RangeInclusive<Idx>

1.0.0 ยท Sourceยง

impl<Idx: Hash> Hash for RangeTo<Idx>

1.26.0 ยท Sourceยง

impl<Idx: Hash> Hash for core::ops::RangeToInclusive<Idx>

1.96.0 ยท Sourceยง

impl<Idx: Hash> Hash for core::range::RangeToInclusive<Idx>

1.41.0 ยท Sourceยง

impl<Ptr: Deref<Target: Hash>> Hash for Pin<Ptr>

Sourceยง

impl<T, const N: usize> Hash for Simd<T, N>
where T: SimdElement + Hash,

1.20.0 ยท Sourceยง

impl<T: ?Sized + Hash> Hash for ManuallyDrop<T>

1.0.0 ยท Sourceยง

impl<T: ?Sized + PointeeSized + Hash> Hash for &T

1.0.0 ยท Sourceยง

impl<T: ?Sized + PointeeSized + Hash> Hash for &mut T

1.0.0 ยท Sourceยง

impl<T: ?Sized + PointeeSized> Hash for *const T

1.0.0 ยท Sourceยง

impl<T: ?Sized + PointeeSized> Hash for *mut T

Sourceยง

impl<T: ?Sized, const VARIANT: u32, const FIELD: u32> Hash for FieldRepresentingType<T, VARIANT, FIELD>

1.0.0 ยท Sourceยง

impl<T: Hash, E: Hash> Hash for Result<T, E>

1.0.0 ยท Sourceยง

impl<T: Hash, const N: usize> Hash for [T; N]

The hash of an array is the same as that of the corresponding slice, as required by the Borrow implementation.

use std::hash::BuildHasher;

let b = std::hash::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));
1.0.0 ยท Sourceยง

impl<T: Hash> Hash for (Tโ‚, Tโ‚‚, โ€ฆ, Tโ‚™)

This trait is implemented for tuples up to twelve items long.

1.17.0 ยท Sourceยง

impl<T: Hash> Hash for Bound<T>

1.0.0 ยท Sourceยง

impl<T: Hash> Hash for Option<T>

1.36.0 ยท Sourceยง

impl<T: Hash> Hash for Poll<T>

1.19.0 ยท Sourceยง

impl<T: Hash> Hash for Reverse<T>

1.74.0 ยท Sourceยง

impl<T: Hash> Hash for Saturating<T>

1.0.0 ยท Sourceยง

impl<T: Hash> Hash for Wrapping<T>

1.0.0 ยท Sourceยง

impl<T: Hash> Hash for [T]

1.25.0 ยท Sourceยง

impl<T: PointeeSized> Hash for NonNull<T>

1.0.0 ยท Sourceยง

impl<T: PointeeSized> Hash for PhantomData<T>

1.21.0 ยท Sourceยง

impl<T> Hash for Discriminant<T>

1.28.0 ยท Sourceยง

impl<T> Hash for NonZero<T>

Sourceยง

impl<T> Hash for PhantomContravariant<T>
where T: ?Sized,

Sourceยง

impl<T> Hash for PhantomCovariant<T>
where T: ?Sized,

Sourceยง

impl<T> Hash for PhantomInvariant<T>
where T: ?Sized,

Sourceยง

impl<T> Hash for SyncView<T>
where T: Sync + Hash + ?Sized,

Sourceยง

impl<Y: Hash, R: Hash> Hash for CoroutineState<Y, R>