From 057837098c41af5345cb91b7591846ab7df4e2c1 Mon Sep 17 00:00:00 2001 From: Wei Xu Date: Mon, 8 Oct 2012 21:39:44 -0700 Subject: [PATCH] Fix fbstring hash Summary: '\0' may actually be part of string. We cannot assume its null terminated and should use another form of fnv32. Test Plan: FBStringTest Reviewed By: xliux@fb.com FB internal diff: D595287 --- folly/FBString.h | 2 +- folly/test/FBStringTest.cpp | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/folly/FBString.h b/folly/FBString.h index 9ac8918c..1c8ec1d3 100644 --- a/folly/FBString.h +++ b/folly/FBString.h @@ -2304,7 +2304,7 @@ namespace std { template <> struct hash< ::folly::fbstring> { size_t operator()(const ::folly::fbstring& s) const { - return ::folly::hash::fnv32(s.c_str()); + return ::folly::hash::fnv32_buf(s.data(), s.size()); } }; } diff --git a/folly/test/FBStringTest.cpp b/folly/test/FBStringTest.cpp index 428bed28..0e6e57f1 100644 --- a/folly/test/FBStringTest.cpp +++ b/folly/test/FBStringTest.cpp @@ -995,6 +995,18 @@ TEST(FBString, testFixedBugs) { } } + +TEST(FBString, testHash) { + fbstring a; + fbstring b; + a.push_back(0); + a.push_back(1); + b.push_back(0); + b.push_back(2); + std::hash hashfunc; + EXPECT_NE(hashfunc(a), hashfunc(b)); +} + int main(int argc, char** argv) { testing::InitGoogleTest(&argc, argv); google::ParseCommandLineFlags(&argc, &argv, true); -- 2.34.1