/
smychkov
/
SStorage
Обзор
Документация
Войти
/
smychkov
/
SStorage
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
tests/test_murmur3.cpp
52 строки
2 KB
Андрей Смычков
feat: util varint, crc32c, murmur3, compression (snappy)
25 апр 2026, 09:00
25 апр 2026, 09:00
a7cf584
Код
Авторство
О чём код?
//============================================================================ // Тесты для MurmurHash3 (32-bit) //============================================================================ #include "../src/util/murmur3.hpp" #include <iostream> #include <string> #include <unordered_set> using namespace sstorage::util; static int g_passed = 0; static int g_failed = 0; #define CHECK(cond) do { \ if (cond) { ++g_passed; } \ else { ++g_failed; std::cerr << "FAIL: " #cond " at line " << __LINE__ << "\n"; } \ } while (0) int main() { // Детерминизм: одинаковый вход с одинаковым seed -> одинаковый хэш CHECK(murmur3("hello", 5, 0) == murmur3("hello", 5, 0)); CHECK(murmur3("", 0, 0) == murmur3("", 0, 0)); // Разные seed -> разные хэши CHECK(murmur3("hello", 5, 0) != murmur3("hello", 5, 1)); // Разные данные -> разные хэши (на простых примерах) CHECK(murmur3("hello", 5, 0) != murmur3("world", 5, 0)); // Хвост разной длины не должен совпадать CHECK(murmur3("a", 1, 0) != murmur3("ab", 2, 0)); CHECK(murmur3("ab", 2, 0) != murmur3("abc", 3, 0)); CHECK(murmur3("abc", 3, 0) != murmur3("abcd", 4, 0)); // Распределение: для 10000 случайных ключей коллизий должно быть мало { std::unordered_set<uint32_t> hashes; for (int i = 0; i < 10000; ++i) { std::string key = "key_" + std::to_string(i) + "_" + std::to_string(i * 31); hashes.insert(murmur3(key)); } // Для 10000 элементов в 32-битном пространстве ожидается ~12 коллизий по парадоксу // дней рождения. Допустим до 50. CHECK(hashes.size() >= 9950); } // Обёртка для std::string CHECK(murmur3(std::string("test")) == murmur3("test", 4, 0)); std::cout << "test_murmur3: passed=" << g_passed << " failed=" << g_failed << "\n"; return g_failed == 0 ? 0 : 1; }