diff options
author | arcadia-devtools <arcadia-devtools@yandex-team.ru> | 2022-02-25 11:28:36 +0300 |
---|---|---|
committer | arcadia-devtools <arcadia-devtools@yandex-team.ru> | 2022-02-25 11:28:36 +0300 |
commit | 840813e444ead1827cba829e6ec0fb9739e03c4a (patch) | |
tree | d02d3fc3388eb180ec62d570cc94920df0282938 /library/cpp/yt | |
parent | 66834feb30614a28410b37b4be1842f6eb9fc7ed (diff) | |
download | ydb-840813e444ead1827cba829e6ec0fb9739e03c4a.tar.gz |
intermediate changes
ref:e3f00ef4e6dea6578b7e9ead4e6c020e1e259495
Diffstat (limited to 'library/cpp/yt')
-rw-r--r-- | library/cpp/yt/misc/CMakeLists.txt | 1 | ||||
-rw-r--r-- | library/cpp/yt/misc/farm_hash.h | 54 | ||||
-rw-r--r-- | library/cpp/yt/misc/unittests/farm_fingerprint_stability_ut.cpp | 39 | ||||
-rw-r--r-- | library/cpp/yt/misc/unittests/ya.make | 1 | ||||
-rw-r--r-- | library/cpp/yt/misc/ya.make | 1 |
5 files changed, 96 insertions, 0 deletions
diff --git a/library/cpp/yt/misc/CMakeLists.txt b/library/cpp/yt/misc/CMakeLists.txt index c9ac50fd711..cccaef7540c 100644 --- a/library/cpp/yt/misc/CMakeLists.txt +++ b/library/cpp/yt/misc/CMakeLists.txt @@ -2,6 +2,7 @@ add_library(cpp-yt-misc) target_link_libraries(cpp-yt-misc PUBLIC contrib-libs-cxxsupp yutil + contrib-libs-farmhash cpp-yt-exception ) target_sources(cpp-yt-misc PRIVATE diff --git a/library/cpp/yt/misc/farm_hash.h b/library/cpp/yt/misc/farm_hash.h new file mode 100644 index 00000000000..be18b3bfc26 --- /dev/null +++ b/library/cpp/yt/misc/farm_hash.h @@ -0,0 +1,54 @@ +#pragma once + +#include <contrib/libs/farmhash/farmhash.h> + +namespace NYT { + +using TFingerprint = ui64; + +//////////////////////////////////////////////////////////////////////////////// + +static inline TFingerprint FarmHash(ui64 value) +{ + return ::util::Fingerprint(value); +} + +static inline TFingerprint FarmHash(const void* buf, size_t len) +{ + return ::util::Hash64(static_cast<const char*>(buf), len); +} + +static inline TFingerprint FarmHash(const void* buf, size_t len, ui64 seed) +{ + return ::util::Hash64WithSeed(static_cast<const char*>(buf), len, seed); +} + +static inline TFingerprint FarmFingerprint(ui64 value) +{ + return ::util::Fingerprint(value); +} + +static inline TFingerprint FarmFingerprint(const void* buf, size_t len) +{ + return ::util::Fingerprint64(static_cast<const char*>(buf), len); +} + +static inline TFingerprint FarmFingerprint(ui64 first, ui64 second) +{ + return ::util::Fingerprint(::util::Uint128(first, second)); +} + +// Forever-fixed Google FarmHash fingerprint. +template <class T> +TFingerprint FarmFingerprint(const T* begin, const T* end) +{ + ui64 result = 0xdeadc0de; + for (const auto* value = begin; value < end; ++value) { + result = FarmFingerprint(result, FarmFingerprint(*value)); + } + return result ^ (end - begin); +} + +//////////////////////////////////////////////////////////////////////////////// + +} // namespace NYT diff --git a/library/cpp/yt/misc/unittests/farm_fingerprint_stability_ut.cpp b/library/cpp/yt/misc/unittests/farm_fingerprint_stability_ut.cpp new file mode 100644 index 00000000000..77726661ee9 --- /dev/null +++ b/library/cpp/yt/misc/unittests/farm_fingerprint_stability_ut.cpp @@ -0,0 +1,39 @@ +#include <yt/yt/core/test_framework/framework.h> + +#include <yt/yt/core/misc/farm_hash.h> + +namespace NYT { +namespace { + +///////////////////////////////////////////////////////////////////////////// +/* + * NB: This provides a sanity check for stability + * of FarmHash and FarmFingerprint functions. + */ + +TEST(TFarmHashTest, Test) +{ + // NB: At the time of creation of this test, FarmHash function relied on + // FarmFingerprint, however we do not require it, so this test is more or less a sanity check. + static_assert(std::is_same<ui64, decltype(FarmHash(42ULL))>::value); + EXPECT_EQ(17355217915646310598ULL, FarmHash(42ULL)); +} + +TEST(TFarmFingerprintTest, Test) +{ + static_assert(std::is_same<ui64, decltype(FarmFingerprint(42ULL))>::value); + EXPECT_EQ(17355217915646310598ULL, FarmFingerprint(42ULL)); + + TString buf = "MDwhat?"; + + static_assert(std::is_same<ui64, decltype(FarmFingerprint(buf.Data(), buf.Size()))>::value); + EXPECT_EQ(10997514911242581312ULL, FarmFingerprint(buf.Data(), buf.Size())); + + static_assert(std::is_same<ui64, decltype(FarmFingerprint(1234ULL, 5678ULL))>::value); + EXPECT_EQ(16769064555670434975ULL, FarmFingerprint(1234ULL, 5678ULL)); +} + +///////////////////////////////////////////////////////////////////////////// + +} // namespace +} // namespace NYT diff --git a/library/cpp/yt/misc/unittests/ya.make b/library/cpp/yt/misc/unittests/ya.make index 690082ca597..0a4ebd56414 100644 --- a/library/cpp/yt/misc/unittests/ya.make +++ b/library/cpp/yt/misc/unittests/ya.make @@ -5,6 +5,7 @@ OWNER(g:yt) SRCS( enum_ut.cpp guid_ut.cpp + farm_fingerprint_stability_ut.cpp preprocessor_ut.cpp ) diff --git a/library/cpp/yt/misc/ya.make b/library/cpp/yt/misc/ya.make index bb76711ddd3..76c75b00349 100644 --- a/library/cpp/yt/misc/ya.make +++ b/library/cpp/yt/misc/ya.make @@ -8,6 +8,7 @@ SRCS( ) PEERDIR( + contrib/libs/farmhash library/cpp/yt/exception ) |