summaryrefslogtreecommitdiffstats
path: root/library/core/src/any.rs
diff options
context:
space:
mode:
Diffstat (limited to 'library/core/src/any.rs')
-rw-r--r--library/core/src/any.rs31
1 files changed, 28 insertions, 3 deletions
diff --git a/library/core/src/any.rs b/library/core/src/any.rs
index 7969f4055..09f52d692 100644
--- a/library/core/src/any.rs
+++ b/library/core/src/any.rs
@@ -153,6 +153,7 @@
#![stable(feature = "rust1", since = "1.0.0")]
use crate::fmt;
+use crate::hash;
use crate::intrinsics;
///////////////////////////////////////////////////////////////////////////////
@@ -662,10 +663,10 @@ impl dyn Any + Send + Sync {
/// While `TypeId` implements `Hash`, `PartialOrd`, and `Ord`, it is worth
/// noting that the hashes and ordering will vary between Rust releases. Beware
/// of relying on them inside of your code!
-#[derive(Clone, Copy, Debug, Hash, Eq, PartialOrd, Ord)]
+#[derive(Clone, Copy, Debug, Eq, PartialOrd, Ord)]
#[stable(feature = "rust1", since = "1.0.0")]
pub struct TypeId {
- t: u64,
+ t: u128,
}
#[stable(feature = "rust1", since = "1.0.0")]
@@ -696,7 +697,31 @@ impl TypeId {
#[stable(feature = "rust1", since = "1.0.0")]
#[rustc_const_unstable(feature = "const_type_id", issue = "77125")]
pub const fn of<T: ?Sized + 'static>() -> TypeId {
- TypeId { t: intrinsics::type_id::<T>() }
+ #[cfg(bootstrap)]
+ let t = intrinsics::type_id::<T>() as u128;
+ #[cfg(not(bootstrap))]
+ let t: u128 = intrinsics::type_id::<T>();
+ TypeId { t }
+ }
+}
+
+#[stable(feature = "rust1", since = "1.0.0")]
+impl hash::Hash for TypeId {
+ #[inline]
+ fn hash<H: hash::Hasher>(&self, state: &mut H) {
+ // We only hash the lower 64 bits of our (128 bit) internal numeric ID,
+ // because:
+ // - The hashing algorithm which backs `TypeId` is expected to be
+ // unbiased and high quality, meaning further mixing would be somewhat
+ // redundant compared to choosing (the lower) 64 bits arbitrarily.
+ // - `Hasher::finish` returns a u64 anyway, so the extra entropy we'd
+ // get from hashing the full value would probably not be useful
+ // (especially given the previous point about the lower 64 bits being
+ // high quality on their own).
+ // - It is correct to do so -- only hashing a subset of `self` is still
+ // with an `Eq` implementation that considers the entire value, as
+ // ours does.
+ (self.t as u64).hash(state);
}
}