21 #define BOOST_TEST_MODULE libjmmcg_tests
22 #include <boost/test/included/unit_test.hpp>
24 #include "core/hash.hpp"
25 #include "core/stats_output.hpp"
32 #include "core/ave_deviation_meter.hpp"
34 #include "absl/hash/hash.h"
36 #include "src/include/robin_hood.h"
38 #include <boost/functional/hash.hpp>
43 using namespace libjmmcg;
46 "FA6AF2C3-5957-48CE-A45D-338A71CA5CC1",
47 "D3DA1A9B-DC2A-47A0-9812-A5071CACD4E8",
48 "2B482B48-69C4-469F-9DB2-FF79DED69CFE",
49 "8DA78ED6-8FE2-4C96-A0A7-FF6DB0CEFCFD",
50 "5CA0C6D0-4516-4C26-9C8D-EF159C83CC66",
51 "7B519D94-89C3-4E5C-B3D4-0DE31545CA84",
52 "31652501-0B76-4BFA-B973-8ABC0C95578B",
53 "AC8DDD15-E763-41F0-A111-4100F80DF5BF",
54 "142F635A-6DAA-4F5C-9CD2-93379779FD67",
55 "9609C637-E667-4307-9B16-D20483E6D4DB",
56 "7CA9EA22-D056-4C2B-8C4F-681B4A4AF0FA",
57 "F1DCA9C9-E1AF-4844-A52F-97B5356876E8",
58 "F025908C-9DD6-424A-85A5-1DF65B1973FC",
59 "884C6532-4A3E-4BAE-9D84-7827DEF2B6F1",
60 "C876839F-9EFA-484E-85F8-10D2D67A9738",
61 "3D85A56A-1177-486D-80D3-9A26A47B8905"
68 using result_type=
std::size_t;
71 using result_type=
std::size_t;
76 using hashes_t=std::vector<murmur2_t::result_type>;
79 template<
class H>
void __fastcall
80 hashem(
std::ostream &, std::vector<
typename H::result_type> &hashes) {
81 typedef std::vector<
typename H::result_type> hashes_t;
82 hashes.reserve(guids.size());
86 std::back_insert_iterator<hashes_t>(hashes),
93 template<
class H>
void __fastcall
95 typedef std::vector<
typename H::result_type> hashes_t;
97 const unsigned short loops_for_conv=50;
98 const double perc_conv_estimate=5.0;
100 const std::pair<timed_results_t,
bool> timed_results(compute_average_deviation<timed_results_t::value_type>(
103 [num_hashes, &os]() {
105 const auto t1=std::chrono::high_resolution_clock::now();
106 for (
int i=0; i<num_hashes; ++i) {
107 hashem<H>(os, hashes);
109 const auto t2=std::chrono::high_resolution_clock::now();
110 return timed_results_t::value_type(
static_cast<
double>(num_hashes*
sizeof(guids)/
sizeof(guids[0]))/(
static_cast<
double>(std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count())/1000000));
113 std::cout<<
typeid(H).name()<<
" hashes/sec="<<timed_results.first<<std::endl;
114 #ifdef JMMCG_PERFORMANCE_TESTS
115 os<<timed_results.first.to_csv()<<std::flush;
116 BOOST_CHECK(!timed_results.second);
120 BOOST_AUTO_TEST_SUITE(hashing)
122 BOOST_AUTO_TEST_CASE(create_murmur2) {
123 [[maybe_unused]] murmur2_t hasher;
126 BOOST_AUTO_TEST_CASE(create_hsieh) {
127 [[maybe_unused]] hsieh_t hasher;
130 BOOST_AUTO_TEST_CASE(create_hsieh_mpl) {
131 [[maybe_unused]] hsieh_mpl_t hasher;
134 BOOST_AUTO_TEST_CASE(hash_murmur2) {
136 BOOST_CHECK(hasher(guids[0])!=0);
139 BOOST_AUTO_TEST_CASE(hash_hsieh) {
141 BOOST_CHECK(hasher(guids[0])!=0);
144 BOOST_AUTO_TEST_CASE(hash_hsieh_mpl) {
146 BOOST_CHECK(hasher(guids[0])!=0);
149 BOOST_AUTO_TEST_SUITE(performance, *stats_to_csv::make_fixture(
"hash.csv"))
168 BOOST_AUTO_TEST_CASE(time_hashes) {
169 #ifdef JMMCG_PERFORMANCE_TESTS
170 const std::size_t num_hashes=1000000;
172 const std::size_t num_hashes=100;
174 do_hashing<abseil_t>(stats_to_csv::handle->stats, num_hashes);
175 do_hashing<robin_hood_t>(stats_to_csv::handle->stats, num_hashes);
176 do_hashing<murmur2_t>(stats_to_csv::handle->stats, num_hashes);
177 do_hashing<hsieh_t>(stats_to_csv::handle->stats, num_hashes);
178 do_hashing<hsieh_mpl_t>(stats_to_csv::handle->stats, num_hashes);
179 do_hashing<boost::hash<std::string>>(stats_to_csv::handle->stats, num_hashes);
180 do_hashing<std::hash<std::string>>(stats_to_csv::handle->stats, num_hashes);
183 BOOST_AUTO_TEST_SUITE_END()
185 BOOST_AUTO_TEST_SUITE_END()