1 /* 2 * Copyright Andrey Semashev 2016. 3 * Distributed under the Boost Software License, Version 1.0. 4 * (See accompanying file LICENSE_1_0.txt or copy at 5 * http://www.boost.org/LICENSE_1_0.txt) 6 */ 7 /*! 8 * \file murmur3.hpp 9 * \author Andrey Semashev 10 * \date 16.01.2016 11 * 12 * \brief This header is the Boost.Log library implementation, see the library documentation 13 * at http://www.boost.org/doc/libs/release/libs/log/doc/html/index.html. 14 * 15 * This file implements MurmurHash3 hash function implementation. See https://en.wikipedia.org/wiki/MurmurHash. 16 */ 17 18 #ifndef BOOST_LOG_MURMUR3_HPP_INCLUDED_ 19 #define BOOST_LOG_MURMUR3_HPP_INCLUDED_ 20 21 #include <boost/log/detail/config.hpp> 22 #include <boost/cstdint.hpp> 23 #include <boost/log/detail/header.hpp> 24 25 namespace boost { 26 27 BOOST_LOG_OPEN_NAMESPACE 28 29 namespace aux { 30 31 //! 32-bit MurmurHash3 algorithm implementation (https://en.wikipedia.org/wiki/MurmurHash) 32 class murmur3_32 33 { 34 private: 35 uint32_t m_state; 36 uint32_t m_len; 37 38 static BOOST_CONSTEXPR_OR_CONST uint32_t c1 = 0xcc9e2d51; 39 static BOOST_CONSTEXPR_OR_CONST uint32_t c2 = 0x1b873593; 40 static BOOST_CONSTEXPR_OR_CONST uint32_t r1 = 15; 41 static BOOST_CONSTEXPR_OR_CONST uint32_t r2 = 13; 42 static BOOST_CONSTEXPR_OR_CONST uint32_t m = 5; 43 static BOOST_CONSTEXPR_OR_CONST uint32_t n = 0xe6546b64; 44 45 public: murmur3_32(uint32_t seed)46 explicit BOOST_CONSTEXPR murmur3_32(uint32_t seed) BOOST_NOEXCEPT : m_state(seed), m_len(0u) 47 { 48 } 49 50 //! Mixing stage of the 32-bit MurmurHash3 algorithm mix(uint32_t value)51 void mix(uint32_t value) BOOST_NOEXCEPT 52 { 53 value *= c1; 54 value = (value << r1) | (value >> (32u - r1)); 55 value *= c2; 56 57 uint32_t h = m_state ^ value; 58 m_state = ((h << r2) | (h >> (32u - r2))) * m + n; 59 m_len += 4u; 60 } 61 62 //! Finalization stage of the 32-bit MurmurHash3 algorithm finalize()63 uint32_t finalize() BOOST_NOEXCEPT 64 { 65 uint32_t h = m_state ^ m_len; 66 h ^= h >> 16u; 67 h *= 0x85ebca6bu; 68 h ^= h >> 13u; 69 h *= 0xc2b2ae35u; 70 h ^= h >> 16u; 71 m_state = h; 72 return h; 73 } 74 }; 75 76 } // namespace aux 77 78 BOOST_LOG_CLOSE_NAMESPACE // namespace log 79 80 } // namespace boost 81 82 #include <boost/log/detail/footer.hpp> 83 84 #endif // BOOST_LOG_MURMUR3_HPP_INCLUDED_ 85