hash_primes_ut.cpp 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include "hash_primes.h"
  2. #include <library/cpp/testing/unittest/registar.h>
  3. #include <util/generic/vector.h>
  4. #include <util/string/builder.h>
  5. #include <util/random/fast.h>
  6. Y_UNIT_TEST_SUITE(TestHashPrimes) {
  7. Y_UNIT_TEST(Test1) {
  8. UNIT_ASSERT_VALUES_EQUAL(HashBucketCount(1), 7);
  9. UNIT_ASSERT_VALUES_EQUAL(HashBucketCount(6), 7);
  10. UNIT_ASSERT_VALUES_EQUAL(HashBucketCount(7), 7);
  11. UNIT_ASSERT_VALUES_EQUAL(HashBucketCount(8), 17);
  12. }
  13. static TVector<size_t> Numbers() {
  14. TVector<size_t> numbers;
  15. TFastRng64 rng{961923};
  16. size_t k = 1;
  17. for (size_t j = 0; j < 8000; ++j) {
  18. numbers.push_back(rng.GenRand());
  19. numbers.push_back(k *= 57);
  20. }
  21. for (size_t p = 1; p != 0; p <<= 1) {
  22. for (size_t offset : {-2, -1, 0, 1, 2}) {
  23. numbers.push_back(p + offset);
  24. }
  25. }
  26. return numbers;
  27. }
  28. static TVector<size_t> Divisors() {
  29. TVector<size_t> divisors;
  30. divisors.push_back(HashBucketCountExt(0)());
  31. for (;;) {
  32. const size_t prevSize = divisors.back();
  33. const size_t nextSize = HashBucketCountExt(prevSize + 1)();
  34. if (nextSize <= prevSize) {
  35. break;
  36. }
  37. divisors.push_back(nextSize);
  38. }
  39. return divisors;
  40. }
  41. Y_UNIT_TEST(Remainder) {
  42. const TVector<size_t> numbers = Numbers();
  43. const TVector<size_t> divisors = Divisors();
  44. auto testDivisor = [&](const auto& c) {
  45. for (size_t n : numbers) {
  46. UNIT_ASSERT_VALUES_EQUAL_C(n % c(), c.Remainder(n), (TStringBuilder() << "n=" << n << "; d=" << c()));
  47. }
  48. };
  49. for (size_t d : divisors) {
  50. const auto c = HashBucketCountExt(d);
  51. UNIT_ASSERT_VALUES_EQUAL_C(d, c(), (TStringBuilder() << "d=" << d));
  52. testDivisor(c);
  53. }
  54. testDivisor(::NPrivate::THashDivisor::One());
  55. }
  56. Y_UNIT_TEST(MisleadingHints) {
  57. TFastRng64 rng{332142};
  58. TVector<size_t> cases = Numbers();
  59. for (size_t d : Divisors()) {
  60. cases.push_back(d);
  61. }
  62. for (size_t c : cases) {
  63. for (size_t reps = 0; reps < 3; ++reps) {
  64. const i8 hint = rng.Uniform(256) - 128;
  65. UNIT_ASSERT_VALUES_EQUAL_C(HashBucketCountExt(c)(), HashBucketCountExt(c, hint)(), (TStringBuilder() << "c=" << c << "; hint=" << hint));
  66. }
  67. }
  68. }
  69. } // Y_UNIT_TEST_SUITE(TestHashPrimes)