pub struct DefPathHash(pub Fingerprint);
Expand description
A DefPathHash
is a fixed-size representation of a DefPath
that is
stable across crate and compilation session boundaries. It consists of two
separate 64-bit hashes. The first uniquely identifies the crate this
DefPathHash
originates from (see StableCrateId), and the second
uniquely identifies the corresponding DefPath
within that crate. Together
they form a unique identifier within an entire crate graph.
There is a very small chance of hash collisions, which would mean that two
different DefPath
s map to the same DefPathHash
. Proceeding compilation
with such a hash collision would very probably lead to an ICE, and in the
worst case lead to a silent mis-compilation. The compiler therefore actively
and exhaustively checks for such hash collisions and aborts compilation if
it finds one.
DefPathHash
uses 64-bit hashes for both the crate-id part and the
crate-internal part, even though it is likely that there are many more
LocalDefId
s in a single crate than there are individual crates in a crate
graph. Since we use the same number of bits in both cases, the collision
probability for the crate-local part will be quite a bit higher (though
still very small).
This imbalance is not by accident: A hash collision in the
crate-local part of a DefPathHash
will be detected and reported while
compiling the crate in question. Such a collision does not depend on
outside factors and can be easily fixed by the crate maintainer (e.g. by
renaming the item in question or by bumping the crate version in a harmless
way).
A collision between crate-id hashes on the other hand is harder to fix because it depends on the set of crates in the entire crate graph of a compilation session. Again, using the same crate with a different version number would fix the issue with a high probability – but that might be easier said then done if the crates in questions are dependencies of third-party crates.
That being said, given a high quality hash function, the collision
probabilities in question are very small. For example, for a big crate like
rustc_middle
(with ~50000 LocalDefId
s as of the time of writing) there
is a probability of roughly 1 in 14,750,000,000 of a crate-internal
collision occurring. For a big crate graph with 1000 crates in it, there is
a probability of 1 in 36,890,000,000,000 of a StableCrateId
collision.
Tuple Fields§
§0: Fingerprint
Implementations§
source§impl DefPathHash
impl DefPathHash
sourcepub fn stable_crate_id(&self) -> StableCrateId
pub fn stable_crate_id(&self) -> StableCrateId
Returns the StableCrateId identifying the crate this DefPathHash originates from.
sourcepub fn local_hash(&self) -> Hash64
pub fn local_hash(&self) -> Hash64
Returns the crate-local part of the DefPathHash.
sourcepub fn new(stable_crate_id: StableCrateId, local_hash: Hash64) -> DefPathHash
pub fn new(stable_crate_id: StableCrateId, local_hash: Hash64) -> DefPathHash
Builds a new DefPathHash with the given StableCrateId and
local_hash
, where local_hash
must be unique within its crate.
Trait Implementations§
source§impl Clone for DefPathHash
impl Clone for DefPathHash
source§fn clone(&self) -> DefPathHash
fn clone(&self) -> DefPathHash
source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl Debug for DefPathHash
impl Debug for DefPathHash
source§impl<__D: SpanDecoder> Decodable<__D> for DefPathHash
impl<__D: SpanDecoder> Decodable<__D> for DefPathHash
source§impl Default for DefPathHash
impl Default for DefPathHash
source§impl<__E: SpanEncoder> Encodable<__E> for DefPathHash
impl<__E: SpanEncoder> Encodable<__E> for DefPathHash
source§impl Hash for DefPathHash
impl Hash for DefPathHash
source§impl<__CTX> HashStable<__CTX> for DefPathHashwhere
__CTX: HashStableContext,
impl<__CTX> HashStable<__CTX> for DefPathHashwhere
__CTX: HashStableContext,
fn hash_stable(&self, __hcx: &mut __CTX, __hasher: &mut StableHasher)
source§impl Ord for DefPathHash
impl Ord for DefPathHash
source§impl PartialEq for DefPathHash
impl PartialEq for DefPathHash
source§impl PartialOrd for DefPathHash
impl PartialOrd for DefPathHash
source§impl StableOrd for DefPathHash
impl StableOrd for DefPathHash
const CAN_USE_UNSTABLE_SORT: bool = true
source§const THIS_IMPLEMENTATION_HAS_BEEN_TRIPLE_CHECKED: () = ()
const THIS_IMPLEMENTATION_HAS_BEEN_TRIPLE_CHECKED: () = ()
Ord
implementation obeys this trait’s contract.source§impl<CTX: HashStableContext> ToStableHashKey<CTX> for DefPathHash
impl<CTX: HashStableContext> ToStableHashKey<CTX> for DefPathHash
type KeyType = DefPathHash
fn to_stable_hash_key(&self, _: &CTX) -> DefPathHash
impl Copy for DefPathHash
impl Eq for DefPathHash
impl StructuralPartialEq for DefPathHash
Auto Trait Implementations§
impl DynSend for DefPathHash
impl DynSync for DefPathHash
impl Freeze for DefPathHash
impl RefUnwindSafe for DefPathHash
impl Send for DefPathHash
impl Sync for DefPathHash
impl Unpin for DefPathHash
impl UnwindSafe for DefPathHash
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)source§impl<Q, K> Comparable<K> for Q
impl<Q, K> Comparable<K> for Q
source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§impl<T> Pointable for T
impl<T> Pointable for T
source§impl<T> StableCompare for Twhere
T: StableOrd,
impl<T> StableCompare for Twhere
T: StableOrd,
const CAN_USE_UNSTABLE_SORT: bool = T::CAN_USE_UNSTABLE_SORT
fn stable_cmp(&self, other: &T) -> Ordering
source§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
source§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
impl<'a, T> Captures<'a> for Twhere
T: ?Sized,
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...)
attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 16 bytes