mirror of
				https://github.com/boostorg/unordered.git
				synced 2025-11-04 09:41:40 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			76 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/* 32b/64b xmx mix function.
 | 
						|
 *
 | 
						|
 * Copyright 2022 Peter Dimov.
 | 
						|
 * Copyright 2022 Joaquin M Lopez Munoz.
 | 
						|
 * Distributed under the Boost Software License, Version 1.0.
 | 
						|
 * (See accompanying file LICENSE_1_0.txt or copy at
 | 
						|
 * http://www.boost.org/LICENSE_1_0.txt)
 | 
						|
 *
 | 
						|
 * See https://www.boost.org/libs/unordered for library home page.
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef BOOST_UNORDERED_DETAIL_XMX_HPP
 | 
						|
#define BOOST_UNORDERED_DETAIL_XMX_HPP
 | 
						|
 | 
						|
#include <boost/cstdint.hpp>
 | 
						|
#include <climits>
 | 
						|
#include <cstddef>
 | 
						|
 | 
						|
namespace boost{
 | 
						|
namespace unordered{
 | 
						|
namespace detail{
 | 
						|
 | 
						|
/* Bit mixer for improvement of statistical properties of hash functions.
 | 
						|
 * The implementation is different on 64bit and 32bit architectures:
 | 
						|
 * 
 | 
						|
 *   - 64bit: same as xmx function in
 | 
						|
 *     http://jonkagstrom.com/bit-mixer-construction/index.html
 | 
						|
 *   - 32bit: generated by Hash Function Prospector
 | 
						|
 *     (https://github.com/skeeto/hash-prospector) and selected as the
 | 
						|
 *     best overall performer in benchmarks of Boost.Unordered flat containers.
 | 
						|
 *     Score assigned by Hash Prospector: 333.7934929677524
 | 
						|
 */
 | 
						|
 | 
						|
#if defined(SIZE_MAX)
 | 
						|
#if ((((SIZE_MAX >> 16) >> 16) >> 16) >> 15) != 0
 | 
						|
#define BOOST_UNORDERED_64B_ARCHITECTURE /* >64 bits assumed as 64 bits */
 | 
						|
#endif
 | 
						|
#elif defined(UINTPTR_MAX) /* used as proxy for std::size_t */
 | 
						|
#if ((((UINTPTR_MAX >> 16) >> 16) >> 16) >> 15) != 0
 | 
						|
#define BOOST_UNORDERED_64B_ARCHITECTURE
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
 | 
						|
static inline std::size_t xmx(std::size_t x)noexcept
 | 
						|
{
 | 
						|
#if defined(BOOST_UNORDERED_64B_ARCHITECTURE)
 | 
						|
 | 
						|
  boost::uint64_t z=(boost::uint64_t)x;
 | 
						|
 | 
						|
  z^=z>>23;
 | 
						|
  z*=0xff51afd7ed558ccdull;
 | 
						|
  z^=z>>23;
 | 
						|
 | 
						|
  return (std::size_t)z;
 | 
						|
 | 
						|
#else /* 32 bits assumed */
 | 
						|
 | 
						|
  x^=x>>18;
 | 
						|
  x*=0x56b5aaadu;
 | 
						|
  x^=x>>16;
 | 
						|
 | 
						|
  return x;
 | 
						|
 | 
						|
#endif
 | 
						|
}
 | 
						|
 | 
						|
#ifdef BOOST_UNORDERED_64B_ARCHITECTURE
 | 
						|
#undef BOOST_UNORDERED_64B_ARCHITECTURE
 | 
						|
#endif
 | 
						|
 | 
						|
} /* namespace detail */
 | 
						|
} /* namespace unordered */
 | 
						|
} /* namespace boost */
 | 
						|
 | 
						|
#endif
 |