pub trait Hash {
// Required method
fn hash<H>(&self, state: &mut H)
where H: Hasher;
// Provided method
fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher,
Self: Sized { ... }
}
Expand description
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,
}
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§
Provided Methods§
1.3.0 · Sourcefn hash_slice<H>(data: &[Self], state: &mut H)
fn hash_slice<H>(data: &[Self], state: &mut H)
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", so this trait is not object safe.
Implementors§
impl Hash for AnsiColor
impl Hash for Color
impl Hash for DependencyKind
impl Hash for Applicability
impl Hash for DiagnosticLevel
impl Hash for Edition
impl Hash for Message
impl Hash for Cfg
impl Hash for CfgExpr
impl Hash for Platform
impl Hash for ValueHint
impl Hash for ContextKind
impl Hash for clap_builder::error::kind::ErrorKind
impl Hash for nom::error::ErrorKind
impl Hash for RecvTimeoutError
impl Hash for TryRecvError
impl Hash for Op
impl Hash for Value
impl Hash for FfiType
impl Hash for Special
impl Hash for StringifierOrInheritOrStatic
impl Hash for StringifierOrStatic
impl Hash for FloatingPointType
impl Hash for IntegerType
impl Hash for TargetLanguage
impl Hash for Level
impl Hash for LevelFilter
impl Hash for AsciiChar
impl Hash for uniffi::deps::static_assertions::_core::cmp::Ordering
impl Hash for Infallible
impl Hash for IpAddr
impl Hash for Ipv6MulticastScope
impl Hash for SocketAddr
impl Hash for uniffi::deps::static_assertions::_core::sync::atomic::Ordering
impl Hash for std::io::error::ErrorKind
impl Hash for bool
impl Hash for char
impl Hash for i8
impl Hash for i16
impl Hash for i32
impl Hash for i64
impl Hash for i128
impl Hash for isize
impl Hash for !
impl Hash for str
impl Hash for u8
impl Hash for u16
impl Hash for u32
impl Hash for u64
impl Hash for u128
impl Hash for ()
impl Hash for usize
impl Hash for Ansi256Color
impl Hash for RgbColor
impl Hash for Effects
impl Hash for Reset
impl Hash for Style
impl Hash for Utf8Path
impl Hash for Utf8PathBuf
impl Hash for Diagnostic
impl Hash for DiagnosticCode
impl Hash for DiagnosticSpan
impl Hash for DiagnosticSpanLine
impl Hash for DiagnosticSpanMacroExpansion
impl Hash for Artifact
impl Hash for ArtifactProfile
impl Hash for BuildFinished
impl Hash for BuildScript
impl Hash for CompilerMessage
impl Hash for PackageId
impl Hash for Target
impl Hash for clap_builder::builder::os_str::OsStr
impl Hash for ValueRange
impl Hash for Str
impl Hash for Id
impl Hash for MatchOptions
impl Hash for Pattern
impl Hash for RecvError
impl Hash for BuildMetadata
impl Hash for Comparator
impl Hash for Prerelease
impl Hash for Version
impl Hash for VersionReq
impl Hash for Map<String, Value>
impl Hash for Number
impl Hash for EmptyBindingsConfig
impl Hash for BooleanLit
impl Hash for EmptyArrayLit
impl Hash for EmptyDictionaryLit
impl Hash for Any
impl Hash for ArrayBuffer
impl Hash for ArrayBufferView
impl Hash for Assign
impl Hash for Async
impl Hash for Attribute
impl Hash for Boolean
impl Hash for BufferSource
impl Hash for Byte
impl Hash for ByteString
impl Hash for Callback
impl Hash for CloseBrace
impl Hash for CloseBracket
impl Hash for CloseParen
impl Hash for Colon
impl Hash for Comma
impl Hash for Const
impl Hash for Constructor
impl Hash for DOMString
impl Hash for DataView
impl Hash for Deleter
impl Hash for Dictionary
impl Hash for Dot
impl Hash for Double
impl Hash for Ellipsis
impl Hash for Enum
impl Hash for weedle::term::Error
impl Hash for False
impl Hash for Float32Array
impl Hash for Float64Array
impl Hash for Float
impl Hash for FrozenArray
impl Hash for Getter
impl Hash for GreaterThan
impl Hash for Implements
impl Hash for Includes
impl Hash for Infinity
impl Hash for Inherit
impl Hash for Int8Array
impl Hash for Int16Array
impl Hash for Int32Array
impl Hash for Interface
impl Hash for Iterable
impl Hash for LegacyCaller
impl Hash for LessThan
impl Hash for Long
impl Hash for Maplike
impl Hash for Minus
impl Hash for Mixin
impl Hash for NaN
impl Hash for Namespace
impl Hash for NegInfinity
impl Hash for Null
impl Hash for Object
impl Hash for Octet
impl Hash for OpenBrace
impl Hash for OpenBracket
impl Hash for OpenParen
impl Hash for Optional
impl Hash for Or
impl Hash for Partial
impl Hash for Promise
impl Hash for QMark
impl Hash for ReadOnly
impl Hash for Record
impl Hash for Required
impl Hash for SemiColon
impl Hash for Sequence
impl Hash for Setlike
impl Hash for Setter
impl Hash for Short
impl Hash for Static
impl Hash for Stringifier
impl Hash for Symbol
impl Hash for True
impl Hash for Typedef
impl Hash for USVString
impl Hash for Uint8Array
impl Hash for Uint8ClampedArray
impl Hash for Uint16Array
impl Hash for Uint32Array
impl Hash for Undefined
impl Hash for Unrestricted
impl Hash for Unsigned
impl Hash for DoubleType
impl Hash for FloatType
impl Hash for LongLongType
impl Hash for LongType
impl Hash for ShortType
impl Hash for Bytes
impl Hash for BytesMut
impl Hash for Layout
impl Hash for TypeId
impl Hash for CStr
impl Hash for uniffi::deps::static_assertions::_core::fmt::Error
impl Hash for PhantomPinned
impl Hash for Ipv4Addr
impl Hash for Ipv6Addr
impl Hash for SocketAddrV4
impl Hash for SocketAddrV6
impl Hash for RangeFull
impl Hash for Alignment
impl Hash for Duration
impl Hash for CString
impl Hash for String
impl Hash for std::ffi::os_str::OsStr
impl Hash for OsString
impl Hash for FileType
impl Hash for UCred
impl Hash for Path
impl Hash for PathBuf
impl Hash for PrefixComponent<'_>
impl Hash for ThreadId
impl Hash for Instant
impl Hash for SystemTime
impl<'a> Hash for Utf8Component<'a>
impl<'a> Hash for Utf8Prefix<'a>
impl<'a> Hash for Argument<'a>
impl<'a> Hash for ExtendedAttribute<'a>
impl<'a> Hash for IdentifierOrString<'a>
impl<'a> Hash for Definition<'a>
impl<'a> Hash for AsyncIterableInterfaceMember<'a>
impl<'a> Hash for InterfaceMember<'a>
impl<'a> Hash for IterableInterfaceMember<'a>
impl<'a> Hash for ConstValue<'a>
impl<'a> Hash for DefaultValue<'a>
impl<'a> Hash for FloatLit<'a>
impl<'a> Hash for IntegerLit<'a>
impl<'a> Hash for MixinMember<'a>
impl<'a> Hash for NamespaceMember<'a>
impl<'a> Hash for ConstType<'a>
impl<'a> Hash for NonAnyType<'a>
impl<'a> Hash for RecordKeyType<'a>
impl<'a> Hash for ReturnType<'a>
impl<'a> Hash for SingleType<'a>
impl<'a> Hash for Type<'a>
impl<'a> Hash for UnionMemberType<'a>
impl<'a> Hash for Component<'a>
impl<'a> Hash for Prefix<'a>
impl<'a> Hash for Utf8PrefixComponent<'a>
impl<'a> Hash for SingleArgument<'a>
impl<'a> Hash for VariadicArgument<'a>
impl<'a> Hash for ExtendedAttributeArgList<'a>
impl<'a> Hash for ExtendedAttributeIdent<'a>
impl<'a> Hash for ExtendedAttributeIdentList<'a>
impl<'a> Hash for ExtendedAttributeNamedArgList<'a>
impl<'a> Hash for ExtendedAttributeNoArgs<'a>
impl<'a> Hash for Default<'a>
impl<'a> Hash for Identifier<'a>
impl<'a> Hash for DictionaryMember<'a>
impl<'a> Hash for AttributeInterfaceMember<'a>
impl<'a> Hash for ConstMember<'a>
impl<'a> Hash for ConstructorInterfaceMember<'a>
impl<'a> Hash for DoubleTypedAsyncIterable<'a>
impl<'a> Hash for DoubleTypedIterable<'a>
impl<'a> Hash for Inheritance<'a>
impl<'a> Hash for MaplikeInterfaceMember<'a>
impl<'a> Hash for OperationInterfaceMember<'a>
impl<'a> Hash for SetlikeInterfaceMember<'a>
impl<'a> Hash for SingleTypedAsyncIterable<'a>
impl<'a> Hash for SingleTypedIterable<'a>
impl<'a> Hash for StringifierMember<'a>
impl<'a> Hash for DecLit<'a>
impl<'a> Hash for FloatValueLit<'a>
impl<'a> Hash for HexLit<'a>
impl<'a> Hash for OctLit<'a>
impl<'a> Hash for StringLit<'a>
impl<'a> Hash for AttributeMixinMember<'a>
impl<'a> Hash for OperationMixinMember<'a>
impl<'a> Hash for AttributeNamespaceMember<'a>
impl<'a> Hash for OperationNamespaceMember<'a>
impl<'a> Hash for CallbackDefinition<'a>
impl<'a> Hash for CallbackInterfaceDefinition<'a>
impl<'a> Hash for DictionaryDefinition<'a>
impl<'a> Hash for EnumDefinition<'a>
impl<'a> Hash for ImplementsDefinition<'a>
impl<'a> Hash for IncludesStatementDefinition<'a>
impl<'a> Hash for InterfaceDefinition<'a>
impl<'a> Hash for InterfaceMixinDefinition<'a>
impl<'a> Hash for NamespaceDefinition<'a>
impl<'a> Hash for PartialDictionaryDefinition<'a>
impl<'a> Hash for PartialInterfaceDefinition<'a>
impl<'a> Hash for PartialInterfaceMixinDefinition<'a>
impl<'a> Hash for PartialNamespaceDefinition<'a>
impl<'a> Hash for TypedefDefinition<'a>
impl<'a> Hash for AttributedNonAnyType<'a>
impl<'a> Hash for AttributedType<'a>
impl<'a> Hash for FrozenArrayType<'a>
impl<'a> Hash for PromiseType<'a>
impl<'a> Hash for RecordType<'a>
impl<'a> Hash for SequenceType<'a>
impl<'a> Hash for Metadata<'a>
impl<'a> Hash for MetadataBuilder<'a>
impl<'a> Hash for Location<'a>
impl<'s> Hash for ParsedArg<'s>
impl<B> Hash for Cow<'_, B>
impl<B, C> Hash for ControlFlow<B, C>
impl<Dyn> Hash for DynMetadata<Dyn>where
Dyn: ?Sized,
impl<F> Hash for Fwhere
F: FnPtr,
impl<Idx> Hash for uniffi::deps::static_assertions::_core::ops::Range<Idx>where
Idx: Hash,
impl<Idx> Hash for uniffi::deps::static_assertions::_core::ops::RangeFrom<Idx>where
Idx: Hash,
impl<Idx> Hash for uniffi::deps::static_assertions::_core::ops::RangeInclusive<Idx>where
Idx: Hash,
impl<Idx> Hash for RangeTo<Idx>where
Idx: Hash,
impl<Idx> Hash for RangeToInclusive<Idx>where
Idx: Hash,
impl<Idx> Hash for uniffi::deps::static_assertions::_core::range::Range<Idx>where
Idx: Hash,
impl<Idx> Hash for uniffi::deps::static_assertions::_core::range::RangeFrom<Idx>where
Idx: Hash,
impl<Idx> Hash for uniffi::deps::static_assertions::_core::range::RangeInclusive<Idx>where
Idx: Hash,
impl<K, V, A> Hash for BTreeMap<K, V, A>
impl<Ptr> Hash for Pin<Ptr>
impl<T> Hash for Resettable<T>where
T: Hash,
impl<T> Hash for Bound<T>where
T: Hash,
impl<T> Hash for Option<T>where
T: Hash,
impl<T> Hash for Poll<T>where
T: Hash,
impl<T> Hash for *const Twhere
T: ?Sized,
impl<T> Hash for *mut Twhere
T: ?Sized,
impl<T> Hash for &T
impl<T> Hash for &mut T
impl<T> Hash for [T]where
T: Hash,
impl<T> Hash for (T₁, T₂, …, Tₙ)
This trait is implemented for tuples up to twelve items long.
impl<T> Hash for Spanned<T>where
T: Hash,
impl<T> Hash for Braced<T>where
T: Hash,
impl<T> Hash for Bracketed<T>where
T: Hash,
impl<T> Hash for Generics<T>where
T: Hash,
impl<T> Hash for Parenthesized<T>where
T: Hash,
impl<T> Hash for MayBeNull<T>where
T: Hash,
impl<T> Hash for Reverse<T>where
T: Hash,
impl<T> Hash for PhantomData<T>where
T: ?Sized,
impl<T> Hash for Discriminant<T>
impl<T> Hash for ManuallyDrop<T>
impl<T> Hash for NonZero<T>where
T: ZeroablePrimitive + Hash,
impl<T> Hash for Saturating<T>where
T: Hash,
impl<T> Hash for Wrapping<T>where
T: Hash,
impl<T> Hash for NonNull<T>where
T: ?Sized,
impl<T, A> Hash for Box<T, A>
impl<T, A> Hash for BTreeSet<T, A>
impl<T, A> Hash for LinkedList<T, A>
impl<T, A> Hash for VecDeque<T, A>
impl<T, A> Hash for Rc<T, A>
impl<T, A> Hash for UniqueRc<T, A>
impl<T, A> Hash for Arc<T, A>
impl<T, A> Hash for Vec<T, A>
The hash of a vector is the same as that of the corresponding slice,
as required by the core::borrow::Borrow
implementation.
use std::hash::BuildHasher;
let b = std::hash::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<T, E> Hash for Result<T, E>
impl<T, S> Hash for Punctuated<T, S>
impl<T, S> Hash for PunctuatedNonEmpty<T, S>
impl<T, const N: usize> Hash for [T; N]where
T: Hash,
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));