Skip to content

Commit 175f467

Browse files
committed
select hash implementation with macros based on word size
fixes #46
1 parent 6275cd7 commit 175f467

File tree

2 files changed

+31
-29
lines changed

2 files changed

+31
-29
lines changed

include/boost/static_string/config.hpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,17 @@
1414
// Are we dependent on Boost?
1515
// #define BOOST_STATIC_STRING_STANDALONE
1616

17+
#include <cstdint>
18+
19+
// detect 32/64 bit
20+
#if UINTPTR_MAX == UINT64_MAX
21+
#define BOOST_STATIC_STRING_ARCH 64
22+
#elif UINTPTR_MAX == UINT32_MAX
23+
#define BOOST_STATIC_STRING_ARCH 32
24+
#else
25+
#error Unknown or unsupported architecture, please open an issue
26+
#endif
27+
1728
// Can we have deduction guides?
1829
#if __cpp_deduction_guides >= 201703L
1930
#define BOOST_STATIC_STRING_USE_DEDUCT

include/boost/static_string/static_string.hpp

Lines changed: 20 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6376,39 +6376,30 @@ struct hash<
63766376
return std::hash<view_type>()(view_type(str.data(), str.size()));
63776377
#else
63786378
std::size_t seed = 0;
6379-
for (CharT const& c : str) {
6380-
mix_impl(std::integral_constant<bool, sizeof(std::size_t) >= 8>{}, seed, c);
6379+
for (CharT const& c : str)
6380+
{
6381+
#if BOOST_STATIC_STRING_ARCH == 64
6382+
seed += 0x9e3779b9 + std::hash<CharT>()( c );
6383+
std::size_t const m = (std::size_t(0xe9846af) << 32) + 0x9b1a615d;
6384+
seed ^= seed >> 32;
6385+
seed *= m;
6386+
seed ^= seed >> 32;
6387+
seed *= m;
6388+
seed ^= seed >> 28;
6389+
#elif BOOST_STATIC_STRING_ARCH == 32
6390+
seed += 0x9e3779b9 + std::hash<CharT>()( c );
6391+
std::size_t const m1 = 0x21f0aaad;
6392+
std::size_t const m2 = 0x735a2d97;
6393+
seed ^= seed >> 16;
6394+
seed *= m1;
6395+
seed ^= seed >> 15;
6396+
seed *= m2;
6397+
seed ^= seed >> 15;
6398+
#endif
63816399
}
63826400
return seed;
63836401
#endif
63846402
}
6385-
6386-
static
6387-
void
6388-
mix_impl(std::true_type, std::size_t& seed, CharT c)
6389-
{
6390-
seed += 0x9e3779b9 + std::hash<CharT>()( c );
6391-
std::size_t const m = (std::size_t(0xe9846af) << 32) + 0x9b1a615d;
6392-
seed ^= seed >> 32;
6393-
seed *= m;
6394-
seed ^= seed >> 32;
6395-
seed *= m;
6396-
seed ^= seed >> 28;
6397-
}
6398-
6399-
static
6400-
void
6401-
mix_impl(std::false_type, std::size_t& seed, CharT c)
6402-
{
6403-
seed += 0x9e3779b9 + std::hash<CharT>()( c );
6404-
std::size_t const m1 = 0x21f0aaad;
6405-
std::size_t const m2 = 0x735a2d97;
6406-
seed ^= seed >> 16;
6407-
seed *= m1;
6408-
seed ^= seed >> 15;
6409-
seed *= m2;
6410-
seed ^= seed >> 15;
6411-
}
64126403
};
64136404
} // std
64146405

0 commit comments

Comments
 (0)