@@ -481,6 +481,50 @@ pub trait BuildHasher {
481481 /// ```
482482 #[ stable( since = "1.7.0" , feature = "build_hasher" ) ]
483483 fn build_hasher ( & self ) -> Self :: Hasher ;
484+
485+ /// Calculates the hash of a single value.
486+ ///
487+ /// This is intended as a convenience for code which *consumes* hashes, such
488+ /// as the implementation of a hash table or in unit tests that check
489+ /// whether a custom [`Hash`] implementation behaves as expected.
490+ ///
491+ /// This must not be used in any code which *creates* hashes, such as in an
492+ /// implementation of [`Hash`]. The way to create a combined hash of
493+ /// multiple values is to call [`Hash::hash`] multiple times using the same
494+ /// [`Hasher`], not to call this method repeatedly and combine the results.
495+ ///
496+ /// # Example
497+ ///
498+ /// ```
499+ /// #![feature(build_hasher_simple_hash_one)]
500+ ///
501+ /// use std::cmp::{max, min};
502+ /// use std::hash::{BuildHasher, Hash, Hasher};
503+ /// struct OrderAmbivalentPair<T: Ord>(T, T);
504+ /// impl<T: Ord + Hash> Hash for OrderAmbivalentPair<T> {
505+ /// fn hash<H: Hasher>(&self, hasher: &mut H) {
506+ /// min(&self.0, &self.1).hash(hasher);
507+ /// max(&self.0, &self.1).hash(hasher);
508+ /// }
509+ /// }
510+ ///
511+ /// // Then later, in a `#[test]` for the type...
512+ /// let bh = std::collections::hash_map::RandomState::new();
513+ /// assert_eq!(
514+ /// bh.hash_one(OrderAmbivalentPair(1, 2)),
515+ /// bh.hash_one(OrderAmbivalentPair(2, 1))
516+ /// );
517+ /// assert_eq!(
518+ /// bh.hash_one(OrderAmbivalentPair(10, 2)),
519+ /// bh.hash_one(&OrderAmbivalentPair(2, 10))
520+ /// );
521+ /// ```
522+ #[ unstable( feature = "build_hasher_simple_hash_one" , issue = "86161" ) ]
523+ fn hash_one < T : Hash > ( & self , x : T ) -> u64 {
524+ let mut hasher = self . build_hasher ( ) ;
525+ x. hash ( & mut hasher) ;
526+ hasher. finish ( )
527+ }
484528}
485529
486530/// Used to create a default [`BuildHasher`] instance for types that implement
0 commit comments