Trait xvc_walker::Hash
1.0.0 · source · pub trait Hash {
fn hash<H>(&self, state: &mut H)
where
H: Hasher;
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 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)].
Prefix collisions
Implementations of hash should ensure that the data they
pass to the Hasher are prefix-free. That is,
unequal values 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)where
H: Hasher,
Self: Sized,
fn hash_slice<H>(data: &[Self], state: &mut H)where
H: Hasher,
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::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());Implementors
impl Hash for PathKind
impl Hash for PatternEffect
impl Hash for PatternRelativity
impl Hash for Source
impl Hash for xvc_walker::error::Error
impl Hash for core::cmp::Ordering
impl Hash for Infallible
impl Hash for Which
impl Hash for core::sync::atomic::Ordering
impl Hash for ErrorKind
impl Hash for IpAddr
impl Hash for Ipv6MulticastScope
impl Hash for SocketAddr
impl Hash for BigEndian
impl Hash for LittleEndian
impl Hash for Month
impl Hash for Weekday
impl Hash for ValueHint
impl Hash for TableComponent
impl Hash for Level
impl Hash for LevelFilter
impl Hash for RecursiveMode
impl Hash for WatcherKind
impl Hash for AccessKind
impl Hash for AccessMode
impl Hash for CreateKind
impl Hash for DataChange
impl Hash for EventKind
impl Hash for Flag
impl Hash for MetadataKind
impl Hash for ModifyKind
impl Hash for RemoveKind
impl Hash for RenameMode
impl Hash for Value
impl Hash for strum::ParseError
impl Hash for strum::ParseError
impl Hash for AttrStyle
impl Hash for Meta
impl Hash for NestedMeta
impl Hash for Fields
impl Hash for Visibility
impl Hash for Data
impl Hash for Expr
impl Hash for GenericMethodArgument
impl Hash for Member
impl Hash for RangeLimits
impl Hash for GenericParam
impl Hash for TraitBoundModifier
impl Hash for TypeParamBound
impl Hash for WherePredicate
impl Hash for FnArg
impl Hash for ForeignItem
impl Hash for ImplItem
impl Hash for Item
impl Hash for TraitItem
impl Hash for UseTree
impl Hash for Lit
impl Hash for MacroDelimiter
impl Hash for BinOp
impl Hash for UnOp
impl Hash for Pat
impl Hash for GenericArgument
impl Hash for PathArguments
impl Hash for Stmt
impl Hash for ReturnType
impl Hash for syn::ty::Type
impl Hash for Origin
impl Hash for Yaml
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 AbsolutePath
impl Hash for CString
impl Hash for String
impl Hash for Layout
impl Hash for TypeId
impl Hash for CStr
impl Hash for core::fmt::Error
impl Hash for PhantomPinned
impl Hash for NonZeroI8
impl Hash for NonZeroI16
impl Hash for NonZeroI32
impl Hash for NonZeroI64
impl Hash for NonZeroI128
impl Hash for NonZeroIsize
impl Hash for NonZeroU8
impl Hash for NonZeroU16
impl Hash for NonZeroU32
impl Hash for NonZeroU64
impl Hash for NonZeroU128
impl Hash for NonZeroUsize
impl Hash for RangeFull
impl Hash for Alignment
impl Hash for core::time::Duration
impl Hash for OsStr
impl Hash for OsString
impl Hash for FileType
impl Hash for Ipv4Addr
impl Hash for Ipv6Addr
impl Hash for SocketAddrV4
impl Hash for SocketAddrV6
impl Hash for UCred
impl Hash for std::path::Path
impl Hash for PathBuf
impl Hash for PrefixComponent<'_>
impl Hash for ThreadId
impl Hash for Instant
impl Hash for SystemTime
impl Hash for time::duration::Duration
impl Hash for Timespec
impl Hash for Tm
impl Hash for Hash
impl Hash for Months
impl Hash for NaiveDate
impl Hash for NaiveDateTime
impl Hash for NaiveTime
impl Hash for FixedOffset
impl Hash for FsStats
impl Hash for MatchOptions
impl Hash for glob::Pattern
impl Hash for Config
impl Hash for notify::event::Event
impl Hash for Ident
impl Hash for RelativePath
impl Hash for RelativePathBuf
impl Hash for ByteBuf
impl Hash for serde_json::number::Number
impl Hash for Mapping
impl Hash for serde_yaml::number::Number
impl Hash for IVec
impl Hash for CompareAndSwapError
impl Hash for syn::attr::Attribute
impl Hash for MetaList
impl Hash for MetaNameValue
impl Hash for Field
impl Hash for FieldsNamed
impl Hash for FieldsUnnamed
impl Hash for Variant
impl Hash for VisCrate
impl Hash for VisPublic
impl Hash for VisRestricted
impl Hash for DataEnum
impl Hash for DataStruct
impl Hash for DataUnion
impl Hash for DeriveInput
impl Hash for Arm
impl Hash for ExprArray
impl Hash for ExprAssign
impl Hash for ExprAssignOp
impl Hash for ExprAsync
impl Hash for ExprAwait
impl Hash for ExprBinary
impl Hash for ExprBlock
impl Hash for ExprBox
impl Hash for ExprBreak
impl Hash for ExprCall
impl Hash for ExprCast
impl Hash for ExprClosure
impl Hash for ExprContinue
impl Hash for ExprField
impl Hash for ExprForLoop
impl Hash for ExprGroup
impl Hash for ExprIf
impl Hash for ExprIndex
impl Hash for ExprLet
impl Hash for ExprLit
impl Hash for ExprLoop
impl Hash for ExprMacro
impl Hash for ExprMatch
impl Hash for ExprMethodCall
impl Hash for ExprParen
impl Hash for ExprPath
impl Hash for ExprRange
impl Hash for ExprReference
impl Hash for ExprRepeat
impl Hash for ExprReturn
impl Hash for ExprStruct
impl Hash for ExprTry
impl Hash for ExprTryBlock
impl Hash for ExprTuple
impl Hash for ExprType
impl Hash for ExprUnary
impl Hash for ExprUnsafe
impl Hash for ExprWhile
impl Hash for ExprYield
impl Hash for FieldValue
impl Hash for Index
impl Hash for Label
impl Hash for MethodTurbofish
impl Hash for File
impl Hash for BoundLifetimes
impl Hash for ConstParam
impl Hash for Generics
impl Hash for LifetimeDef
impl Hash for PredicateEq
impl Hash for PredicateLifetime
impl Hash for PredicateType
impl Hash for TraitBound
impl Hash for TypeParam
impl Hash for WhereClause
impl Hash for ForeignItemFn
impl Hash for ForeignItemMacro
impl Hash for ForeignItemStatic
impl Hash for ForeignItemType
impl Hash for ImplItemConst
impl Hash for ImplItemMacro
impl Hash for ImplItemMethod
impl Hash for ImplItemType
impl Hash for ItemConst
impl Hash for ItemEnum
impl Hash for ItemExternCrate
impl Hash for ItemFn
impl Hash for ItemForeignMod
impl Hash for ItemImpl
impl Hash for ItemMacro2
impl Hash for ItemMacro
impl Hash for ItemMod
impl Hash for ItemStatic
impl Hash for ItemStruct
impl Hash for ItemTrait
impl Hash for ItemTraitAlias
impl Hash for ItemType
impl Hash for ItemUnion
impl Hash for ItemUse
impl Hash for Receiver
impl Hash for Signature
impl Hash for TraitItemConst
impl Hash for TraitItemMacro
impl Hash for TraitItemMethod
impl Hash for TraitItemType
impl Hash for UseGlob
impl Hash for UseGroup
impl Hash for UseName
impl Hash for UsePath
impl Hash for UseRename
impl Hash for Lifetime
impl Hash for LitBool
impl Hash for LitByte
impl Hash for LitByteStr
impl Hash for LitChar
impl Hash for LitFloat
impl Hash for LitInt
impl Hash for LitStr
impl Hash for syn::mac::Macro
impl Hash for Nothing
impl Hash for FieldPat
impl Hash for PatBox
impl Hash for PatIdent
impl Hash for PatLit
impl Hash for PatMacro
impl Hash for PatOr
impl Hash for PatPath
impl Hash for PatRange
impl Hash for PatReference
impl Hash for PatRest
impl Hash for PatSlice
impl Hash for PatStruct
impl Hash for PatTuple
impl Hash for PatTupleStruct
impl Hash for PatType
impl Hash for PatWild
impl Hash for AngleBracketedGenericArguments
impl Hash for Binding
impl Hash for Constraint
impl Hash for ParenthesizedGenericArguments
impl Hash for syn::path::Path
impl Hash for PathSegment
impl Hash for QSelf
impl Hash for Block
impl Hash for Local
impl Hash for Abstract
impl Hash for Add
impl Hash for AddEq
impl Hash for And
impl Hash for AndAnd
impl Hash for AndEq
impl Hash for As
impl Hash for Async
impl Hash for At
impl Hash for Auto
impl Hash for Await
impl Hash for Bang
impl Hash for Become
impl Hash for syn::token::Box
impl Hash for Brace
impl Hash for Bracket
impl Hash for Break
impl Hash for Caret
impl Hash for CaretEq
impl Hash for Colon2
impl Hash for Colon
impl Hash for Comma
impl Hash for Const
impl Hash for Continue
impl Hash for Crate
impl Hash for Default
impl Hash for Div
impl Hash for DivEq
impl Hash for Do
impl Hash for Dollar
impl Hash for Dot2
impl Hash for Dot3
impl Hash for Dot
impl Hash for DotDotEq
impl Hash for Dyn
impl Hash for Else
impl Hash for Enum
impl Hash for Eq
impl Hash for EqEq
impl Hash for Extern
impl Hash for FatArrow
impl Hash for Final
impl Hash for Fn
impl Hash for For
impl Hash for Ge
impl Hash for Group
impl Hash for Gt
impl Hash for If
impl Hash for Impl
impl Hash for In
impl Hash for LArrow
impl Hash for Le
impl Hash for Let
impl Hash for Loop
impl Hash for Lt
impl Hash for syn::token::Macro
impl Hash for syn::token::Match
impl Hash for Mod
impl Hash for Move
impl Hash for MulEq
impl Hash for Mut
impl Hash for Ne
impl Hash for Or
impl Hash for OrEq
impl Hash for OrOr
impl Hash for Override
impl Hash for Paren
impl Hash for Pound
impl Hash for Priv
impl Hash for Pub
impl Hash for Question
impl Hash for RArrow
impl Hash for Ref
impl Hash for Rem
impl Hash for RemEq
impl Hash for Return
impl Hash for SelfType
impl Hash for SelfValue
impl Hash for Semi
impl Hash for Shl
impl Hash for ShlEq
impl Hash for Shr
impl Hash for ShrEq
impl Hash for Star
impl Hash for Static
impl Hash for Struct
impl Hash for Sub
impl Hash for SubEq
impl Hash for Super
impl Hash for Tilde
impl Hash for Trait
impl Hash for Try
impl Hash for syn::token::Type
impl Hash for Typeof
impl Hash for Underscore
impl Hash for Union
impl Hash for Unsafe
impl Hash for Unsized
impl Hash for Use
impl Hash for Virtual
impl Hash for Where
impl Hash for While
impl Hash for Yield
impl Hash for Abi
impl Hash for BareFnArg
impl Hash for TypeArray
impl Hash for TypeBareFn
impl Hash for TypeGroup
impl Hash for TypeImplTrait
impl Hash for TypeInfer
impl Hash for TypeMacro
impl Hash for TypeNever
impl Hash for TypeParen
impl Hash for TypePath
impl Hash for TypePtr
impl Hash for TypeReference
impl Hash for TypeSlice
impl Hash for TypeTraitObject
impl Hash for TypeTuple
impl Hash for Variadic
impl Hash for ATerm
impl Hash for B0
impl Hash for B1
impl Hash for Z0
impl Hash for Equal
impl Hash for Greater
impl Hash for Less
impl Hash for UTerm
impl Hash for OpaqueOrigin
impl Hash for Url
URLs hash like their serialization.
impl Hash for Hyphenated
impl Hash for Simple
impl Hash for Urn
impl Hash for uuid::error::Error
impl Hash for Uuid
impl Hash for Glob
impl Hash for Attribute
impl Hash for BStr
impl Hash for BString
impl Hash for ClearType
impl Hash for Color
impl Hash for Colored
impl Hash for Event
impl Hash for EventMask
impl Hash for FileTime
impl Hash for Handle
impl Hash for KeyCode
impl Hash for KeyEvent
impl Hash for KeyModifiers
impl Hash for Match
impl Hash for MouseButton
impl Hash for MouseEvent
impl Hash for MouseEventKind
impl Hash for RawOsStr
impl Hash for RawOsString
impl Hash for SigId
impl Hash for Token
impl Hash for WatchDescriptor
impl Hash for WatchMask
impl<'a> Hash for std::path::Component<'a>
impl<'a> Hash for Prefix<'a>
impl<'a> Hash for relative_path::Component<'a>
impl<'a> Hash for Location<'a>
impl<'a> Hash for Metadata<'a>
impl<'a> Hash for MetadataBuilder<'a>
impl<'a> Hash for Bytes<'a>
impl<'a> Hash for ImplGenerics<'a>
impl<'a> Hash for Turbofish<'a>
impl<'a> Hash for TypeGenerics<'a>
impl<'a> Hash for HyphenatedRef<'a>
impl<'a> Hash for SimpleRef<'a>
impl<'a> Hash for UrnRef<'a>
impl<'s> Hash for ParsedArg<'s>
impl<'s, T> Hash for SliceVec<'s, T>where
T: Hash,
impl<A> Hash for ArrayVec<A>where
A: Array,
<A as Array>::Item: Hash,
impl<A> Hash for SmallVec<A>where
A: Array,
<A as Array>::Item: Hash,
impl<A> Hash for TinyVec<A>where
A: Array,
<A as Array>::Item: Hash,
impl<A, B> Hash for EitherOrBoth<A, B>where
A: Hash,
B: Hash,
impl<B> Hash for Cow<'_, B>where
B: Hash + ToOwned + ?Sized,
impl<B, C> Hash for ControlFlow<B, C>where
B: Hash,
C: Hash,
impl<Dyn> Hash for DynMetadata<Dyn>where
Dyn: ?Sized,
impl<H> Hash for HeaderWithLength<H>where
H: Hash,
impl<H, T> Hash for HeaderSlice<H, T>where
H: Hash,
T: Hash + ?Sized,
impl<H, T> Hash for ThinArc<H, T>where
H: Hash,
T: Hash,
impl<Idx> Hash for Range<Idx>where
Idx: Hash,
impl<Idx> Hash for RangeFrom<Idx>where
Idx: Hash,
impl<Idx> Hash for RangeInclusive<Idx>where
Idx: Hash,
impl<Idx> Hash for RangeTo<Idx>where
Idx: Hash,
impl<Idx> Hash for RangeToInclusive<Idx>where
Idx: Hash,
impl<K, V, A> Hash for BTreeMap<K, V, A>where
K: Hash,
V: Hash,
A: Allocator + Clone,
impl<K, V, S> Hash for LinkedHashMap<K, V, S>where
K: Hash + Eq,
V: Hash,
S: BuildHasher,
impl<L, R> Hash for Either<L, R>where
L: Hash,
R: Hash,
impl<P> Hash for Pin<P>where
P: Deref,
<P as Deref>::Target: Hash,
impl<Ret, T> Hash for fn (T₁, T₂, …, Tₙ) -> Ret
This trait is implemented for function pointers with up to twelve arguments.
impl<Ret, T> Hash for extern "C" fn (T₁, T₂, …, Tₙ) -> Ret
This trait is implemented for function pointers with up to twelve arguments.
impl<Ret, T> Hash for extern "C" fn (T₁, T₂, …, Tₙ, ...) -> Ret
This trait is implemented for function pointers with up to twelve arguments.
impl<Ret, T> Hash for extern "C-unwind" fn (T₁, T₂, …, Tₙ) -> Ret
This trait is implemented for function pointers with up to twelve arguments.
impl<Ret, T> Hash for extern "C-unwind" fn (T₁, T₂, …, Tₙ, ...) -> Ret
This trait is implemented for function pointers with up to twelve arguments.
impl<Ret, T> Hash for unsafe fn (T₁, T₂, …, Tₙ) -> Ret
This trait is implemented for function pointers with up to twelve arguments.
impl<Ret, T> Hash for unsafe extern "C" fn (T₁, T₂, …, Tₙ) -> Ret
This trait is implemented for function pointers with up to twelve arguments.
impl<Ret, T> Hash for unsafe extern "C" fn (T₁, T₂, …, Tₙ, ...) -> Ret
This trait is implemented for function pointers with up to twelve arguments.
impl<Ret, T> Hash for unsafe extern "C-unwind" fn (T₁, T₂, …, Tₙ) -> Ret
This trait is implemented for function pointers with up to twelve arguments.
impl<Ret, T> Hash for unsafe extern "C-unwind" fn (T₁, T₂, …, Tₙ, ...) -> Ret
This trait is implemented for function pointers with up to twelve arguments.
impl<S> Hash for Host<S>where
S: 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 LocalResult<T>where
T: Hash,
impl<T> Hash for *const Twhere
T: ?Sized,
impl<T> Hash for *mut Twhere
T: ?Sized,
impl<T> Hash for &Twhere
T: Hash + ?Sized,
impl<T> Hash for &mut Twhere
T: Hash + ?Sized,
impl<T> Hash for [T]where
T: Hash,
impl<T> Hash for (T₁, T₂, …, Tₙ)where
T: Hash + ?Sized,
This trait is implemented for tuples up to twelve items long.
impl<T> Hash for LinkedList<T>where
T: Hash,
impl<T> Hash for Rc<T>where
T: Hash + ?Sized,
impl<T> Hash for alloc::sync::Arc<T>where
T: Hash + ?Sized,
impl<T> Hash for Reverse<T>where
T: Hash,
impl<T> Hash for PhantomData<T>where
T: ?Sized,
impl<T> Hash for ManuallyDrop<T>where
T: Hash + ?Sized,
impl<T> Hash for Discriminant<T>
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> Hash for Spanned<T>where
T: Hash,
impl<T> Hash for triomphe::arc::Arc<T>where
T: Hash + ?Sized,
impl<T> Hash for CachePadded<T>where
T: Hash,
impl<T, A> Hash for alloc::boxed::Box<T, A>where
T: Hash + ?Sized,
A: Allocator,
impl<T, A> Hash for BTreeSet<T, A>where
T: Hash,
A: Allocator + Clone,
impl<T, A> Hash for VecDeque<T, A>where
T: Hash,
A: Allocator,
impl<T, A> Hash for Vec<T, A>where
T: Hash,
A: Allocator,
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<T, E> Hash for Result<T, E>where
T: Hash,
E: Hash,
impl<T, N> Hash for GenericArray<T, N>where
T: Hash,
N: ArrayLength<T>,
impl<T, P> Hash for Punctuated<T, P>where
T: Hash,
P: Hash,
impl<T, const CAP: usize> Hash for arrayvec::arrayvec::ArrayVec<T, CAP>where
T: Hash,
impl<T, const LANES: usize> Hash for Simd<T, LANES>where
LaneCount<LANES>: SupportedLaneCount,
T: SimdElement + Hash,
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.
#![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));