aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/yt
diff options
context:
space:
mode:
authorarcadia-devtools <arcadia-devtools@yandex-team.ru>2022-02-25 11:28:36 +0300
committerarcadia-devtools <arcadia-devtools@yandex-team.ru>2022-02-25 11:28:36 +0300
commit840813e444ead1827cba829e6ec0fb9739e03c4a (patch)
treed02d3fc3388eb180ec62d570cc94920df0282938 /library/cpp/yt
parent66834feb30614a28410b37b4be1842f6eb9fc7ed (diff)
downloadydb-840813e444ead1827cba829e6ec0fb9739e03c4a.tar.gz
intermediate changes
ref:e3f00ef4e6dea6578b7e9ead4e6c020e1e259495
Diffstat (limited to 'library/cpp/yt')
-rw-r--r--library/cpp/yt/misc/CMakeLists.txt1
-rw-r--r--library/cpp/yt/misc/farm_hash.h54
-rw-r--r--library/cpp/yt/misc/unittests/farm_fingerprint_stability_ut.cpp39
-rw-r--r--library/cpp/yt/misc/unittests/ya.make1
-rw-r--r--library/cpp/yt/misc/ya.make1
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
)