@@ -239,6 +239,78 @@ TEST(HashingTest, HashCombineRangeLengthDiff) {
239239 }
240240}
241241
242+ TEST (HashingTest, HashCombineRangeGoldenTest) {
243+ struct { const char *s; uint64_t hash; } golden_data[] = {
244+ #if SIZE_MAX == UINT64_MAX || SIZE_MAX == UINT32_MAX
245+ { " a" , 0xaeb6f9d5517c61f8ULL },
246+ { " ab" , 0x7ab1edb96be496b4ULL },
247+ { " abc" , 0xe38e60bf19c71a3fULL },
248+ { " abcde" , 0xd24461a66de97f6eULL },
249+ { " abcdefgh" , 0x4ef872ec411dec9dULL },
250+ { " abcdefghijklm" , 0xe8a865539f4eadfeULL },
251+ { " abcdefghijklmnopqrstu" , 0x261cdf85faaf4e79ULL },
252+ { " abcdefghijklmnopqrstuvwxyzabcdef" , 0x43ba70e4198e3b2aULL },
253+ { " abcdefghijklmnopqrstuvwxyzabcdef"
254+ " abcdefghijklmnopqrstuvwxyzghijkl"
255+ " abcdefghijklmnopqrstuvwxyzmnopqr"
256+ " abcdefghijklmnopqrstuvwxyzstuvwx"
257+ " abcdefghijklmnopqrstuvwxyzyzabcd" , 0xdcd57fb2afdf72beULL },
258+ { " a" , 0xaeb6f9d5517c61f8ULL },
259+ { " aa" , 0xf2b3b69a9736a1ebULL },
260+ { " aaa" , 0xf752eb6f07b1cafeULL },
261+ { " aaaaa" , 0x812bd21e1236954cULL },
262+ { " aaaaaaaa" , 0xff07a2cff08ac587ULL },
263+ { " aaaaaaaaaaaaa" , 0x84ac949d54d704ecULL },
264+ { " aaaaaaaaaaaaaaaaaaaaa" , 0xcb2c8fb6be8f5648ULL },
265+ { " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" , 0xcc40ab7f164091b6ULL },
266+ { " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
267+ " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
268+ " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
269+ " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
270+ " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" , 0xc58e174c1e78ffe9ULL },
271+ { " z" , 0x1ba160d7e8f8785cULL },
272+ { " zz" , 0x2c5c03172f1285d7ULL },
273+ { " zzz" , 0x9d2c4f4b507a2ac3ULL },
274+ { " zzzzz" , 0x0f03b9031735693aULL },
275+ { " zzzzzzzz" , 0xe674147c8582c08eULL },
276+ { " zzzzzzzzzzzzz" , 0x3162d9fa6938db83ULL },
277+ { " zzzzzzzzzzzzzzzzzzzzz" , 0x37b9a549e013620cULL },
278+ { " zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" , 0x8921470aff885016ULL },
279+ { " zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
280+ " zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
281+ " zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
282+ " zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
283+ " zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" , 0xf60fdcd9beb08441ULL },
284+ { " a" , 0xaeb6f9d5517c61f8ULL },
285+ { " ab" , 0x7ab1edb96be496b4ULL },
286+ { " aba" , 0x3edb049950884d0aULL },
287+ { " ababa" , 0x8f2de9e73a97714bULL },
288+ { " abababab" , 0xee14a29ddf0ce54cULL },
289+ { " ababababababa" , 0x38b3ddaada2d52b4ULL },
290+ { " ababababababababababa" , 0xd3665364219f2b85ULL },
291+ { " abababababababababababababababab" , 0xa75cd6afbf1bc972ULL },
292+ { " abababababababababababababababab"
293+ " abababababababababababababababab"
294+ " abababababababababababababababab"
295+ " abababababababababababababababab"
296+ " abababababababababababababababab" , 0x840192d129f7a22bULL }
297+ #else
298+ #error This test only supports 64-bit and 32-bit systems.
299+ #endif
300+ };
301+ for (unsigned i = 0 ; i < sizeof (golden_data)/sizeof (*golden_data); ++i) {
302+ StringRef str = golden_data[i].s ;
303+ hash_code hash = hash_combine_range (str.begin (), str.end ());
304+ #if 0 // Enable this to generate paste-able text for the above structure.
305+ std::string member_str = "\"" + str.str() + "\",";
306+ fprintf(stderr, " { %-35s 0x%016llxULL },\n",
307+ member_str.c_str(), static_cast<uint64_t>(hash));
308+ #endif
309+ EXPECT_EQ (static_cast <size_t >(golden_data[i].hash ),
310+ static_cast <size_t >(hash));
311+ }
312+ }
313+
242314TEST (HashingTest, HashCombineBasicTest) {
243315 // Hashing a sequence of homogenous types matches range hashing.
244316 const int i1 = 42 , i2 = 43 , i3 = 123 , i4 = 999 , i5 = 0 , i6 = 79 ;
0 commit comments