forked from CleverRaven/Cataclysm-DDA
-
Notifications
You must be signed in to change notification settings - Fork 0
/
hash_test.cpp
59 lines (54 loc) · 2.15 KB
/
hash_test.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <algorithm>
#include <cstddef>
#include <functional>
#include <iterator>
#include <vector>
#include "cata_catch.h"
#include "point.h"
// A larger number for this would be GREAT, but the test isn't efficient enough to make it larger.
// Previously tried inserting into an unordered_set,
// but that was slower than appending to a vector and doing the sort+unique manually.
// This should be dramatically faster (but approximate) if we insert into a HyperLogLog instead.
#ifdef _GLIBCXX_DEBUG
// Smaller test on libstdc++ debug containers because otherwise this takes ~1 minute.
constexpr int MAX_COORDINATE = 30;
#else
static constexpr int MAX_COORDINATE = 300;
#endif
static constexpr int NUM_ENTRIES_2D = ( ( MAX_COORDINATE * 2 ) + 1 ) * ( (
MAX_COORDINATE * 2 ) + 1 );
static constexpr int NUM_ENTRIES_3D = NUM_ENTRIES_2D * 21;
static size_t count_unique_elements( std::vector<size_t> &found_elements )
{
std::sort( found_elements.begin(), found_elements.end() );
const auto range_end = std::unique( found_elements.begin(), found_elements.end() );
return std::distance( found_elements.begin(), range_end );
}
TEST_CASE( "point_hash_distribution", "[hash]" )
{
std::vector<size_t> found_hashes;
found_hashes.reserve( NUM_ENTRIES_2D );
size_t element_count = 0;
for( int x = -MAX_COORDINATE; x <= MAX_COORDINATE; ++x ) {
for( int y = -MAX_COORDINATE; y <= MAX_COORDINATE; ++y ) {
element_count++;
found_hashes.push_back( std::hash<point> {}( point{ x, y } ) );
}
}
CHECK( count_unique_elements( found_hashes ) > element_count * 0.9 );
}
TEST_CASE( "tripoint_hash_distribution", "[hash]" )
{
std::vector<size_t> found_hashes;
found_hashes.reserve( NUM_ENTRIES_3D );
size_t element_count = 0;
for( int x = -MAX_COORDINATE; x <= MAX_COORDINATE; ++x ) {
for( int y = -MAX_COORDINATE; y <= MAX_COORDINATE; ++y ) {
for( int z = -10; z <= 10; ++z ) {
element_count++;
found_hashes.push_back( std::hash<tripoint> {}( { x, y, z } ) );
}
}
}
CHECK( count_unique_elements( found_hashes ) > element_count * 0.9 );
}