Struct rustc_hir::def_id::DefPathHash
source · 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
Auto Trait Implementations§
impl RefUnwindSafe for DefPathHash
impl Send for DefPathHash
impl Sync for DefPathHash
impl Unpin for DefPathHash
impl UnwindSafe for DefPathHash
Blanket Implementations§
source§impl<'tcx, T> ArenaAllocatable<'tcx, IsCopy> for Twhere
T: Copy,
impl<'tcx, T> ArenaAllocatable<'tcx, IsCopy> for Twhere T: Copy,
fn allocate_on<'a>(self, arena: &'a Arena<'tcx>) -> &'a mut T
fn allocate_from_iter<'a>( arena: &'a Arena<'tcx>, iter: impl IntoIterator<Item = T> ) -> &'a mut [T]
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
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