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 DefPaths 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 LocalDefIds 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 LocalDefIds 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

Returns the StableCrateId identifying the crate this DefPathHash originates from.

Returns the crate-local part of the DefPathHash.

Used for tests.

Builds a new DefPathHash with the given StableCrateId and local_hash, where local_hash must be unique within its crate.

Trait Implementations

Immutably borrows from an owned value. Read more

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

Formats the value using the given formatter. Read more

Feeds this value into the given Hasher. Read more

Feeds a slice of this type into the given Hasher. Read more

This method returns an Ordering between self and other. Read more

Compares and returns the maximum of two values. Read more

Compares and returns the minimum of two values. Read more

Restrict a value to a certain interval. Read more

This method tests for self and other values to be equal, and is used by ==. Read more

This method tests for !=.

This method returns an ordering between self and other values if one exists. Read more

This method tests less than (for self and other) and is used by the < operator. Read more

This method tests less than or equal to (for self and other) and is used by the <= operator. Read more

This method tests greater than (for self and other) and is used by the > operator. Read more

This method tests greater than or equal to (for self and other) and is used by the >= operator. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.

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