Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(10)

Side by Side Diff: third_party/tcmalloc/chromium/src/farmhash.cc

Issue 986503002: components/metrics: Add runtime memory leak detector (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove Author label from new files; Check type in LeakDetectorValueType comparators; Add missing fi… Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2014 Google, Inc.
2 //
3 // Permission is hereby granted, free of charge, to any person obtaining a copy
4 // of this software and associated documentation files (the "Software"), to deal
5 // in the Software without restriction, including without limitation the rights
6 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 // copies of the Software, and to permit persons to whom the Software is
8 // furnished to do so, subject to the following conditions:
9 //
10 // The above copyright notice and this permission notice shall be included in
11 // all copies or substantial portions of the Software.
12 //
13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19 // THE SOFTWARE.
20 //
21 // FarmHash, by Geoff Pike
22
23 #include "farmhash.h"
24 // FARMHASH ASSUMPTIONS: Modify as needed, or use -DFARMHASH_ASSUME_SSE42 etc.
25 // Note that if you use -DFARMHASH_ASSUME_SSE42 you likely need -msse42
26 // (or its equivalent for your compiler); if you use -DFARMHASH_ASSUME_AESNI
27 // you likely need -maes (or its equivalent for your compiler).
28
29 #ifdef FARMHASH_ASSUME_SSSE3
30 #undef FARMHASH_ASSUME_SSSE3
31 #define FARMHASH_ASSUME_SSSE3 1
32 #endif
33
34 #ifdef FARMHASH_ASSUME_SSE41
35 #undef FARMHASH_ASSUME_SSE41
36 #define FARMHASH_ASSUME_SSE41 1
37 #endif
38
39 #ifdef FARMHASH_ASSUME_SSE42
40 #undef FARMHASH_ASSUME_SSE42
41 #define FARMHASH_ASSUME_SSE42 1
42 #endif
43
44 #ifdef FARMHASH_ASSUME_AESNI
45 #undef FARMHASH_ASSUME_AESNI
46 #define FARMHASH_ASSUME_AESNI 1
47 #endif
48
49 #ifdef FARMHASH_ASSUME_AVX
50 #undef FARMHASH_ASSUME_AVX
51 #define FARMHASH_ASSUME_AVX 1
52 #endif
53
54 #if !defined(FARMHASH_CAN_USE_CXX11) && defined(LANG_CXX11)
55 #define FARMHASH_CAN_USE_CXX11 1
56 #else
57 #undef FARMHASH_CAN_USE_CXX11
58 #define FARMHASH_CAN_USE_CXX11 0
59 #endif
60
61 // FARMHASH PORTABILITY LAYER: Runtime error if misconfigured
62
63 #ifndef FARMHASH_DIE_IF_MISCONFIGURED
64 #define FARMHASH_DIE_IF_MISCONFIGURED do { *(char*)(len % 17) = 0; } while (0)
65 #endif
66
67 // FARMHASH PORTABILITY LAYER: "static inline" or similar
68
69 #ifndef STATIC_INLINE
70 #define STATIC_INLINE static inline
71 #endif
72
73 // FARMHASH PORTABILITY LAYER: LIKELY and UNLIKELY
74
75 #if !defined(LIKELY)
76 #if defined(FARMHASH_NO_BUILTIN_EXPECT) || (defined(FARMHASH_OPTIONAL_BUILTIN_EX PECT) && !defined(HAVE_BUILTIN_EXPECT))
jar (doing other things) 2015/07/28 06:17:51 nit: Probably use a backslash to get this to wrap
77 #define LIKELY(x) (x)
78 #else
79 #define LIKELY(x) (__builtin_expect(!!(x), 1))
80 #endif
81 #endif
82
83 #undef UNLIKELY
84 #define UNLIKELY(x) !LIKELY(!(x))
85
86 // FARMHASH PORTABILITY LAYER: endianness and byteswapping functions
87
88 #ifdef WORDS_BIGENDIAN
89 #undef FARMHASH_BIG_ENDIAN
90 #define FARMHASH_BIG_ENDIAN 1
91 #endif
92
93 #if defined(FARMHASH_LITTLE_ENDIAN) && defined(FARMHASH_BIG_ENDIAN)
94 #error
95 #endif
96
97 #if !defined(FARMHASH_LITTLE_ENDIAN) && !defined(FARMHASH_BIG_ENDIAN)
98 #define FARMHASH_UNKNOWN_ENDIAN 1
99 #endif
100
101 #if !defined(bswap_32) || !defined(bswap_64)
102 #undef bswap_32
103 #undef bswap_64
104
105 #if defined(HAVE_BUILTIN_BSWAP) || defined(__clang__) || \
106 (defined(__GNUC__) && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 8) || \
107 __GNUC__ >= 5))
108 // Easy case for bswap: no header file needed.
109 #define bswap_32(x) __builtin_bswap32(x)
110 #define bswap_64(x) __builtin_bswap64(x)
111 #endif
112
113 #endif
114
115 #if defined(FARMHASH_UNKNOWN_ENDIAN) || !defined(bswap_64)
116
117 #ifdef _MSC_VER
118
119 #undef bswap_32
120 #undef bswap_64
121 #define bswap_32(x) _byteswap_ulong(x)
122 #define bswap_64(x) _byteswap_uint64(x)
123
124 #elif defined(__APPLE__)
125
126 // Mac OS X / Darwin features
127 #include <libkern/OSByteOrder.h>
128 #undef bswap_32
129 #undef bswap_64
130 #define bswap_32(x) OSSwapInt32(x)
131 #define bswap_64(x) OSSwapInt64(x)
132
133 #elif defined(__sun) || defined(sun)
134
135 #include <sys/byteorder.h>
136 #undef bswap_32
137 #undef bswap_64
138 #define bswap_32(x) BSWAP_32(x)
139 #define bswap_64(x) BSWAP_64(x)
140
141 #elif defined(__FreeBSD__)
142
143 #include <sys/endian.h>
144 #undef bswap_32
145 #undef bswap_64
146 #define bswap_32(x) bswap32(x)
147 #define bswap_64(x) bswap64(x)
148
149 #elif defined(__OpenBSD__)
150
151 #include <sys/types.h>
152 #undef bswap_32
153 #undef bswap_64
154 #define bswap_32(x) swap32(x)
155 #define bswap_64(x) swap64(x)
156
157 #elif defined(__NetBSD__)
158
159 #include <sys/types.h>
160 #include <machine/bswap.h>
161 #if defined(__BSWAP_RENAME) && !defined(__bswap_32)
162 #undef bswap_32
163 #undef bswap_64
164 #define bswap_32(x) bswap32(x)
165 #define bswap_64(x) bswap64(x)
166 #endif
167
168 #else
169
170 #undef bswap_32
171 #undef bswap_64
172 #include <byteswap.h>
173
174 #endif
175
176 #ifdef WORDS_BIGENDIAN
177 #define FARMHASH_BIG_ENDIAN 1
178 #endif
179
180 #endif
181
182 #ifdef FARMHASH_BIG_ENDIAN
183 #define uint32_in_expected_order(x) (bswap_32(x))
184 #define uint64_in_expected_order(x) (bswap_64(x))
185 #else
186 #define uint32_in_expected_order(x) (x)
187 #define uint64_in_expected_order(x) (x)
188 #endif
189
190 namespace NAMESPACE_FOR_HASH_FUNCTIONS {
191
192 STATIC_INLINE uint64_t Fetch64(const char *p) {
193 uint64_t result;
194 memcpy(&result, p, sizeof(result));
195 return uint64_in_expected_order(result);
196 }
197
198 STATIC_INLINE uint32_t Fetch32(const char *p) {
199 uint32_t result;
200 memcpy(&result, p, sizeof(result));
201 return uint32_in_expected_order(result);
202 }
203
204 STATIC_INLINE uint32_t Bswap32(uint32_t val) { return bswap_32(val); }
205 STATIC_INLINE uint64_t Bswap64(uint64_t val) { return bswap_64(val); }
206
207 // FARMHASH PORTABILITY LAYER: bitwise rot
208
209 STATIC_INLINE uint32_t BasicRotate32(uint32_t val, int shift) {
210 // Avoid shifting by 32: doing so yields an undefined result.
211 return shift == 0 ? val : ((val >> shift) | (val << (32 - shift)));
212 }
213
214 STATIC_INLINE uint64_t BasicRotate64(uint64_t val, int shift) {
215 // Avoid shifting by 64: doing so yields an undefined result.
216 return shift == 0 ? val : ((val >> shift) | (val << (64 - shift)));
217 }
218
219 #if defined(_MSC_VER) && defined(FARMHASH_ROTR)
220
221 STATIC_INLINE uint32_t Rotate32(uint32_t val, int shift) {
222 return sizeof(unsigned long) == sizeof(val) ?
223 _lrotr(val, shift) :
224 BasicRotate32(val, shift);
225 }
226
227 STATIC_INLINE uint64_t Rotate64(uint64_t val, int shift) {
228 return sizeof(unsigned long) == sizeof(val) ?
229 _lrotr(val, shift) :
230 BasicRotate64(val, shift);
231 }
232
233 #else
234
235 STATIC_INLINE uint32_t Rotate32(uint32_t val, int shift) {
236 return BasicRotate32(val, shift);
237 }
238 STATIC_INLINE uint64_t Rotate64(uint64_t val, int shift) {
239 return BasicRotate64(val, shift);
240 }
241
242 #endif
243
244 } // namespace NAMESPACE_FOR_HASH_FUNCTIONS
245
246 // FARMHASH PORTABILITY LAYER: debug mode or max speed?
247 // One may use -DFARMHASH_DEBUG=1 or -DFARMHASH_DEBUG=0 to force the issue.
248
249 #if !defined(FARMHASH_DEBUG) && (!defined(NDEBUG) || defined(_DEBUG))
250 #define FARMHASH_DEBUG 1
251 #endif
252
253 #undef debug_mode
254 #if FARMHASH_DEBUG
255 #define debug_mode 1
256 #else
257 #define debug_mode 0
258 #endif
259
260 // PLATFORM-SPECIFIC FUNCTIONS AND MACROS
261
262 #undef x86_64
263 #if defined (__x86_64) || defined (__x86_64__)
264 #define x86_64 1
265 #else
266 #define x86_64 0
267 #endif
268
269 #undef x86
270 #if defined(__i386__) || defined(__i386) || defined(__X86__)
271 #define x86 1
272 #else
273 #define x86 x86_64
274 #endif
275
276 #if !defined(is_64bit)
277 #define is_64bit (x86_64 || (sizeof(void*) == 8))
278 #endif
279
280 #undef can_use_ssse3
281 #if defined(__SSSE3__) || defined(FARMHASH_ASSUME_SSSE3)
282
283 #include <immintrin.h>
284 #define can_use_ssse3 1
285 // Now we can use _mm_hsub_epi16 and so on.
286
287 #else
288 #define can_use_ssse3 0
289 #endif
290
291 #undef can_use_sse41
292 #if defined(__SSE4_1__) || defined(FARMHASH_ASSUME_SSE41)
293
294 #include <immintrin.h>
295 #define can_use_sse41 1
296 // Now we can use _mm_insert_epi64 and so on.
297
298 #else
299 #define can_use_sse41 0
300 #endif
301
302 #undef can_use_sse42
303 #if defined(__SSE4_2__) || defined(FARMHASH_ASSUME_SSE42)
304
305 #include <nmmintrin.h>
306 #define can_use_sse42 1
307 // Now we can use _mm_crc32_u{32,16,8}. And on 64-bit platforms, _mm_crc32_u64.
308
309 #else
310 #define can_use_sse42 0
311 #endif
312
313 #undef can_use_aesni
314 #if defined(__AES__) || defined(FARMHASH_ASSUME_AESNI)
315
316 #include <wmmintrin.h>
317 #define can_use_aesni 1
318 // Now we can use _mm_aesimc_si128 and so on.
319
320 #else
321 #define can_use_aesni 0
322 #endif
323
324 #undef can_use_avx
325 #if defined(__AVX__) || defined(FARMHASH_ASSUME_AVX)
326
327 #include <immintrin.h>
328 #define can_use_avx 1
329
330 #else
331 #define can_use_avx 0
332 #endif
333
334 #if can_use_ssse3 || can_use_sse41 || can_use_sse42 || can_use_aesni || can_use_ avx
335 STATIC_INLINE __m128i Fetch128(const char* s) {
336 return _mm_loadu_si128(reinterpret_cast<const __m128i*>(s));
337 }
338 #endif
339 // Building blocks for hash functions
340
341 // std::swap() was in <algorithm> but is in <utility> from C++11 on.
342 #if !FARMHASH_CAN_USE_CXX11
343 #include <algorithm>
344 #endif
345
346 #undef PERMUTE3
347 #define PERMUTE3(a, b, c) do { std::swap(a, b); std::swap(a, c); } while (0)
348
349 namespace NAMESPACE_FOR_HASH_FUNCTIONS {
350
351 // Some primes between 2^63 and 2^64 for various uses.
352 static const uint64_t k0 = 0xc3a5c85c97cb3127ULL;
353 static const uint64_t k1 = 0xb492b66fbe98f273ULL;
354 static const uint64_t k2 = 0x9ae16a3b2f90404fULL;
355
356 // Magic numbers for 32-bit hashing. Copied from Murmur3.
357 static const uint32_t c1 = 0xcc9e2d51;
358 static const uint32_t c2 = 0x1b873593;
359
360 // A 32-bit to 32-bit integer hash copied from Murmur3.
361 STATIC_INLINE uint32_t fmix(uint32_t h)
362 {
363 h ^= h >> 16;
364 h *= 0x85ebca6b;
365 h ^= h >> 13;
366 h *= 0xc2b2ae35;
367 h ^= h >> 16;
368 return h;
369 }
370
371 STATIC_INLINE uint32_t Mur(uint32_t a, uint32_t h) {
372 // Helper from Murmur3 for combining two 32-bit values.
373 a *= c1;
374 a = Rotate32(a, 17);
375 a *= c2;
376 h ^= a;
377 h = Rotate32(h, 19);
378 return h * 5 + 0xe6546b64;
379 }
380
381 template <typename T> STATIC_INLINE T DebugTweak(T x) {
382 if (debug_mode) {
383 if (sizeof(x) == 4) {
384 x = ~Bswap32(x * c1);
385 } else {
386 x = ~Bswap64(x * k1);
387 }
388 }
389 return x;
390 }
391
392 template <> uint128_t DebugTweak(uint128_t x) {
393 if (debug_mode) {
394 uint64_t y = DebugTweak(Uint128Low64(x));
395 uint64_t z = DebugTweak(Uint128High64(x));
396 y += z;
397 z += y;
398 x = Uint128(y, z * k1);
399 }
400 return x;
401 }
402
403 } // namespace NAMESPACE_FOR_HASH_FUNCTIONS
404
405 using namespace std;
406 using namespace NAMESPACE_FOR_HASH_FUNCTIONS;
407 namespace farmhashna {
408 #undef Fetch
409 #define Fetch Fetch64
410
411 #undef Rotate
412 #define Rotate Rotate64
413
414 #undef Bswap
415 #define Bswap Bswap64
416
417 STATIC_INLINE uint64_t ShiftMix(uint64_t val) {
418 return val ^ (val >> 47);
419 }
420
421 STATIC_INLINE uint64_t HashLen16(uint64_t u, uint64_t v) {
422 return Hash128to64(Uint128(u, v));
423 }
424
425 STATIC_INLINE uint64_t HashLen16(uint64_t u, uint64_t v, uint64_t mul) {
426 // Murmur-inspired hashing.
427 uint64_t a = (u ^ v) * mul;
428 a ^= (a >> 47);
429 uint64_t b = (v ^ a) * mul;
430 b ^= (b >> 47);
431 b *= mul;
432 return b;
433 }
434
435 STATIC_INLINE uint64_t HashLen0to16(const char *s, size_t len) {
436 if (len >= 8) {
437 uint64_t mul = k2 + len * 2;
438 uint64_t a = Fetch(s) + k2;
439 uint64_t b = Fetch(s + len - 8);
440 uint64_t c = Rotate(b, 37) * mul + a;
441 uint64_t d = (Rotate(a, 25) + b) * mul;
442 return HashLen16(c, d, mul);
443 }
444 if (len >= 4) {
445 uint64_t mul = k2 + len * 2;
446 uint64_t a = Fetch32(s);
447 return HashLen16(len + (a << 3), Fetch32(s + len - 4), mul);
448 }
449 if (len > 0) {
450 uint8_t a = s[0];
451 uint8_t b = s[len >> 1];
452 uint8_t c = s[len - 1];
453 uint32_t y = static_cast<uint32_t>(a) + (static_cast<uint32_t>(b) << 8);
454 uint32_t z = len + (static_cast<uint32_t>(c) << 2);
455 return ShiftMix(y * k2 ^ z * k0) * k2;
456 }
457 return k2;
458 }
459
460 // This probably works well for 16-byte strings as well, but it may be overkill
461 // in that case.
462 STATIC_INLINE uint64_t HashLen17to32(const char *s, size_t len) {
463 uint64_t mul = k2 + len * 2;
464 uint64_t a = Fetch(s) * k1;
465 uint64_t b = Fetch(s + 8);
466 uint64_t c = Fetch(s + len - 8) * mul;
467 uint64_t d = Fetch(s + len - 16) * k2;
468 return HashLen16(Rotate(a + b, 43) + Rotate(c, 30) + d,
469 a + Rotate(b + k2, 18) + c, mul);
470 }
471
472 // Return a 16-byte hash for 48 bytes. Quick and dirty.
473 // Callers do best to use "random-looking" values for a and b.
474 STATIC_INLINE pair<uint64_t, uint64_t> WeakHashLen32WithSeeds(
475 uint64_t w, uint64_t x, uint64_t y, uint64_t z, uint64_t a, uint64_t b) {
476 a += w;
477 b = Rotate(b + a + z, 21);
478 uint64_t c = a;
479 a += x;
480 a += y;
481 b += Rotate(a, 44);
482 return make_pair(a + z, b + c);
483 }
484
485 // Return a 16-byte hash for s[0] ... s[31], a, and b. Quick and dirty.
486 STATIC_INLINE pair<uint64_t, uint64_t> WeakHashLen32WithSeeds(
487 const char* s, uint64_t a, uint64_t b) {
488 return WeakHashLen32WithSeeds(Fetch(s),
489 Fetch(s + 8),
490 Fetch(s + 16),
491 Fetch(s + 24),
492 a,
493 b);
494 }
495
496 // Return an 8-byte hash for 33 to 64 bytes.
497 STATIC_INLINE uint64_t HashLen33to64(const char *s, size_t len) {
498 uint64_t mul = k2 + len * 2;
499 uint64_t a = Fetch(s) * k2;
500 uint64_t b = Fetch(s + 8);
501 uint64_t c = Fetch(s + len - 8) * mul;
502 uint64_t d = Fetch(s + len - 16) * k2;
503 uint64_t y = Rotate(a + b, 43) + Rotate(c, 30) + d;
504 uint64_t z = HashLen16(y, a + Rotate(b + k2, 18) + c, mul);
505 uint64_t e = Fetch(s + 16) * mul;
506 uint64_t f = Fetch(s + 24);
507 uint64_t g = (y + Fetch(s + len - 32)) * mul;
508 uint64_t h = (z + Fetch(s + len - 24)) * mul;
509 return HashLen16(Rotate(e + f, 43) + Rotate(g, 30) + h,
510 e + Rotate(f + a, 18) + g, mul);
511 }
512
513 uint64_t Hash64(const char *s, size_t len) {
514 const uint64_t seed = 81;
515 if (len <= 32) {
516 if (len <= 16) {
517 return HashLen0to16(s, len);
518 } else {
519 return HashLen17to32(s, len);
520 }
521 } else if (len <= 64) {
522 return HashLen33to64(s, len);
523 }
524
525 // For strings over 64 bytes we loop. Internal state consists of
526 // 56 bytes: v, w, x, y, and z.
527 uint64_t x = seed;
528 uint64_t y = seed * k1 + 113;
529 uint64_t z = ShiftMix(y * k2 + 113) * k2;
530 pair<uint64_t, uint64_t> v = make_pair(0, 0);
531 pair<uint64_t, uint64_t> w = make_pair(0, 0);
532 x = x * k2 + Fetch(s);
533
534 // Set end so that after the loop we have 1 to 64 bytes left to process.
535 const char* end = s + ((len - 1) / 64) * 64;
536 const char* last64 = end + ((len - 1) & 63) - 63;
537 assert(s + len - 64 == last64);
538 do {
539 x = Rotate(x + y + v.first + Fetch(s + 8), 37) * k1;
540 y = Rotate(y + v.second + Fetch(s + 48), 42) * k1;
541 x ^= w.second;
542 y += v.first + Fetch(s + 40);
543 z = Rotate(z + w.first, 33) * k1;
544 v = WeakHashLen32WithSeeds(s, v.second * k1, x + w.first);
545 w = WeakHashLen32WithSeeds(s + 32, z + w.second, y + Fetch(s + 16));
546 std::swap(z, x);
547 s += 64;
548 } while (s != end);
549 uint64_t mul = k1 + ((z & 0xff) << 1);
550 // Make s point to the last 64 bytes of input.
551 s = last64;
552 w.first += ((len - 1) & 63);
553 v.first += w.first;
554 w.first += v.first;
555 x = Rotate(x + y + v.first + Fetch(s + 8), 37) * mul;
556 y = Rotate(y + v.second + Fetch(s + 48), 42) * mul;
557 x ^= w.second * 9;
558 y += v.first * 9 + Fetch(s + 40);
559 z = Rotate(z + w.first, 33) * mul;
560 v = WeakHashLen32WithSeeds(s, v.second * mul, x + w.first);
561 w = WeakHashLen32WithSeeds(s + 32, z + w.second, y + Fetch(s + 16));
562 std::swap(z, x);
563 return HashLen16(HashLen16(v.first, w.first, mul) + ShiftMix(y) * k0 + z,
564 HashLen16(v.second, w.second, mul) + x,
565 mul);
566 }
567
568 uint64_t Hash64WithSeeds(const char *s, size_t len, uint64_t seed0, uint64_t see d1);
jar (doing other things) 2015/07/28 06:17:51 nit: 80 characters.
569
570 uint64_t Hash64WithSeed(const char *s, size_t len, uint64_t seed) {
571 return Hash64WithSeeds(s, len, k2, seed);
572 }
573
574 uint64_t Hash64WithSeeds(const char *s, size_t len, uint64_t seed0, uint64_t see d1) {
jar (doing other things) 2015/07/28 06:17:51 nit: 80 characters. If possible, please consider
575 return HashLen16(Hash64(s, len) - seed0, seed1);
576 }
577 } // namespace farmhashna
578 namespace farmhashuo {
579 #undef Fetch
580 #define Fetch Fetch64
581
582 #undef Rotate
583 #define Rotate Rotate64
584
585 STATIC_INLINE uint64_t H(uint64_t x, uint64_t y, uint64_t mul, int r) {
586 uint64_t a = (x ^ y) * mul;
587 a ^= (a >> 47);
588 uint64_t b = (y ^ a) * mul;
589 return Rotate(b, r) * mul;
590 }
591
592 uint64_t Hash64WithSeeds(const char *s, size_t len,
593 uint64_t seed0, uint64_t seed1) {
594 if (len <= 64) {
595 return farmhashna::Hash64WithSeeds(s, len, seed0, seed1);
596 }
597
598 // For strings over 64 bytes we loop. Internal state consists of
599 // 64 bytes: u, v, w, x, y, and z.
600 uint64_t x = seed0;
601 uint64_t y = seed1 * k2 + 113;
602 uint64_t z = farmhashna::ShiftMix(y * k2) * k2;
603 pair<uint64_t, uint64_t> v = make_pair(seed0, seed1);
604 pair<uint64_t, uint64_t> w = make_pair(0, 0);
605 uint64_t u = x - z;
606 x *= k2;
607 uint64_t mul = k2 + (u & 0x82);
608
609 // Set end so that after the loop we have 1 to 64 bytes left to process.
610 const char* end = s + ((len - 1) / 64) * 64;
611 const char* last64 = end + ((len - 1) & 63) - 63;
612 assert(s + len - 64 == last64);
613 do {
614 uint64_t a0 = Fetch(s);
615 uint64_t a1 = Fetch(s + 8);
616 uint64_t a2 = Fetch(s + 16);
617 uint64_t a3 = Fetch(s + 24);
618 uint64_t a4 = Fetch(s + 32);
619 uint64_t a5 = Fetch(s + 40);
620 uint64_t a6 = Fetch(s + 48);
621 uint64_t a7 = Fetch(s + 56);
622 x += a0 + a1;
623 y += a2;
624 z += a3;
625 v.first += a4;
626 v.second += a5 + a1;
627 w.first += a6;
628 w.second += a7;
629
630 x = Rotate(x, 26);
631 x *= 9;
632 y = Rotate(y, 29);
633 z *= mul;
634 v.first = Rotate(v.first, 33);
635 v.second = Rotate(v.second, 30);
636 w.first ^= x;
637 w.first *= 9;
638 z = Rotate(z, 32);
639 z += w.second;
640 w.second += z;
641 z *= 9;
642 std::swap(u, y);
643
644 z += a0 + a6;
645 v.first += a2;
646 v.second += a3;
647 w.first += a4;
648 w.second += a5 + a6;
649 x += a1;
650 y += a7;
651
652 y += v.first;
653 v.first += x - y;
654 v.second += w.first;
655 w.first += v.second;
656 w.second += x - y;
657 x += w.second;
658 w.second = Rotate(w.second, 34);
659 std::swap(u, z);
660 s += 64;
661 } while (s != end);
662 // Make s point to the last 64 bytes of input.
663 s = last64;
664 u *= 9;
665 v.second = Rotate(v.second, 28);
666 v.first = Rotate(v.first, 20);
667 w.first += ((len - 1) & 63);
668 u += y;
669 y += u;
670 x = Rotate(y - x + v.first + Fetch(s + 8), 37) * mul;
671 y = Rotate(y ^ v.second ^ Fetch(s + 48), 42) * mul;
672 x ^= w.second * 9;
673 y += v.first + Fetch(s + 40);
674 z = Rotate(z + w.first, 33) * mul;
675 v = farmhashna::WeakHashLen32WithSeeds(s, v.second * mul, x + w.first);
676 w = farmhashna::WeakHashLen32WithSeeds(s + 32, z + w.second, y + Fetch(s + 16) );
jar (doing other things) 2015/07/28 06:17:51 nit: 80 characters
677 return H(farmhashna::HashLen16(v.first + x, w.first ^ y, mul) + z - u,
678 H(v.second + y, w.second + z, k2, 30) ^ x,
679 k2,
680 31);
681 }
682
683 uint64_t Hash64WithSeed(const char *s, size_t len, uint64_t seed) {
684 return len <= 64 ? farmhashna::Hash64WithSeed(s, len, seed) :
685 Hash64WithSeeds(s, len, 0, seed);
686 }
687
688 uint64_t Hash64(const char *s, size_t len) {
689 return len <= 64 ? farmhashna::Hash64(s, len) :
690 Hash64WithSeeds(s, len, 81, 0);
691 }
692 } // namespace farmhashuo
693 namespace farmhashxo {
694 #undef Fetch
695 #define Fetch Fetch64
696
697 #undef Rotate
698 #define Rotate Rotate64
699
700 STATIC_INLINE uint64_t H32(const char *s, size_t len, uint64_t mul,
701 uint64_t seed0 = 0, uint64_t seed1 = 0) {
702 uint64_t a = Fetch(s) * k1;
703 uint64_t b = Fetch(s + 8);
704 uint64_t c = Fetch(s + len - 8) * mul;
705 uint64_t d = Fetch(s + len - 16) * k2;
706 uint64_t u = Rotate(a + b, 43) + Rotate(c, 30) + d + seed0;
707 uint64_t v = a + Rotate(b + k2, 18) + c + seed1;
708 a = farmhashna::ShiftMix((u ^ v) * mul);
709 b = farmhashna::ShiftMix((v ^ a) * mul);
710 return b;
711 }
712
713 // Return an 8-byte hash for 33 to 64 bytes.
714 STATIC_INLINE uint64_t HashLen33to64(const char *s, size_t len) {
715 uint64_t mul0 = k2 - 30;
716 uint64_t mul1 = k2 - 30 + 2 * len;
717 uint64_t h0 = H32(s, 32, mul0);
718 uint64_t h1 = H32(s + len - 32, 32, mul1);
719 return ((h1 * mul1) + h0) * mul1;
720 }
721
722 // Return an 8-byte hash for 65 to 96 bytes.
723 STATIC_INLINE uint64_t HashLen65to96(const char *s, size_t len) {
724 uint64_t mul0 = k2 - 114;
725 uint64_t mul1 = k2 - 114 + 2 * len;
726 uint64_t h0 = H32(s, 32, mul0);
727 uint64_t h1 = H32(s + 32, 32, mul1);
728 uint64_t h2 = H32(s + len - 32, 32, mul1, h0, h1);
729 return (h2 * 9 + (h0 >> 17) + (h1 >> 21)) * mul1;
730 }
731
732 uint64_t Hash64(const char *s, size_t len) {
733 if (len <= 32) {
734 if (len <= 16) {
735 return farmhashna::HashLen0to16(s, len);
736 } else {
737 return farmhashna::HashLen17to32(s, len);
738 }
739 } else if (len <= 64) {
740 return HashLen33to64(s, len);
741 } else if (len <= 96) {
742 return HashLen65to96(s, len);
743 } else if (len <= 256) {
744 return farmhashna::Hash64(s, len);
745 } else {
746 return farmhashuo::Hash64(s, len);
747 }
748 }
749
750 uint64_t Hash64WithSeeds(const char *s, size_t len, uint64_t seed0, uint64_t see d1) {
jar (doing other things) 2015/07/28 06:17:51 nit: 80 chars
751 return farmhashuo::Hash64WithSeeds(s, len, seed0, seed1);
752 }
753
754 uint64_t Hash64WithSeed(const char *s, size_t len, uint64_t seed) {
755 return farmhashuo::Hash64WithSeed(s, len, seed);
756 }
757 } // namespace farmhashxo
758 namespace farmhashte {
759 #if !can_use_sse41 || !x86_64
760
761 uint64_t Hash64(const char *s, size_t len) {
762 FARMHASH_DIE_IF_MISCONFIGURED;
763 return s == NULL ? 0 : len;
764 }
765
766 uint64_t Hash64WithSeed(const char *s, size_t len, uint64_t seed) {
767 FARMHASH_DIE_IF_MISCONFIGURED;
768 return seed + Hash64(s, len);
769 }
770
771 uint64_t Hash64WithSeeds(const char *s, size_t len,
772 uint64_t seed0, uint64_t seed1) {
773 FARMHASH_DIE_IF_MISCONFIGURED;
774 return seed0 + seed1 + Hash64(s, len);
775 }
776
777 #else
778
779 #undef Fetch
780 #define Fetch Fetch64
781
782 #undef Rotate
783 #define Rotate Rotate64
784
785 #undef Bswap
786 #define Bswap Bswap64
787
788 // Helpers for data-parallel operations (1x 128 bits or 2x 64 or 4x 32).
789 STATIC_INLINE __m128i Add(__m128i x, __m128i y) { return _mm_add_epi64(x, y); }
790 STATIC_INLINE __m128i Xor(__m128i x, __m128i y) { return _mm_xor_si128(x, y); }
791 STATIC_INLINE __m128i Mul(__m128i x, __m128i y) { return _mm_mullo_epi32(x, y); }
jar (doing other things) 2015/07/28 06:17:51 nit: 80 chars here and later in file.
792 STATIC_INLINE __m128i Shuf(__m128i x, __m128i y) { return _mm_shuffle_epi8(y, x) ; }
793
794 // Requires n >= 256. Requires SSE4.1. Should be slightly faster if the
795 // compiler uses AVX instructions (e.g., use the -mavx flag with GCC).
796 STATIC_INLINE uint64_t Hash64Long(const char* s, size_t n,
797 uint64_t seed0, uint64_t seed1) {
798 const __m128i kShuf =
799 _mm_set_epi8(4, 11, 10, 5, 8, 15, 6, 9, 12, 2, 14, 13, 0, 7, 3, 1);
800 const __m128i kMult =
801 _mm_set_epi8(0xbd, 0xd6, 0x33, 0x39, 0x45, 0x54, 0xfa, 0x03,
802 0x34, 0x3e, 0x33, 0xed, 0xcc, 0x9e, 0x2d, 0x51);
803 uint64_t seed2 = (seed0 + 113) * (seed1 + 9);
804 uint64_t seed3 = (Rotate(seed0, 23) + 27) * (Rotate(seed1, 30) + 111);
805 __m128i d0 = _mm_cvtsi64_si128(seed0);
806 __m128i d1 = _mm_cvtsi64_si128(seed1);
807 __m128i d2 = Shuf(kShuf, d0);
808 __m128i d3 = Shuf(kShuf, d1);
809 __m128i d4 = Xor(d0, d1);
810 __m128i d5 = Xor(d1, d2);
811 __m128i d6 = Xor(d2, d4);
812 __m128i d7 = _mm_set1_epi32(seed2 >> 32);
813 __m128i d8 = Mul(kMult, d2);
814 __m128i d9 = _mm_set1_epi32(seed3 >> 32);
815 __m128i d10 = _mm_set1_epi32(seed3);
816 __m128i d11 = Add(d2, _mm_set1_epi32(seed2));
817 const char* end = s + (n & ~static_cast<size_t>(255));
818 do {
819 __m128i z;
820 z = Fetch128(s);
821 d0 = Add(d0, z);
822 d1 = Shuf(kShuf, d1);
823 d2 = Xor(d2, d0);
824 d4 = Xor(d4, z);
825 d4 = Xor(d4, d1);
826 std::swap(d0, d6);
827 z = Fetch128(s + 16);
828 d5 = Add(d5, z);
829 d6 = Shuf(kShuf, d6);
830 d8 = Shuf(kShuf, d8);
831 d7 = Xor(d7, d5);
832 d0 = Xor(d0, z);
833 d0 = Xor(d0, d6);
834 std::swap(d5, d11);
835 z = Fetch128(s + 32);
836 d1 = Add(d1, z);
837 d2 = Shuf(kShuf, d2);
838 d4 = Shuf(kShuf, d4);
839 d5 = Xor(d5, z);
840 d5 = Xor(d5, d2);
841 std::swap(d10, d4);
842 z = Fetch128(s + 48);
843 d6 = Add(d6, z);
844 d7 = Shuf(kShuf, d7);
845 d0 = Shuf(kShuf, d0);
846 d8 = Xor(d8, d6);
847 d1 = Xor(d1, z);
848 d1 = Add(d1, d7);
849 z = Fetch128(s + 64);
850 d2 = Add(d2, z);
851 d5 = Shuf(kShuf, d5);
852 d4 = Add(d4, d2);
853 d6 = Xor(d6, z);
854 d6 = Xor(d6, d11);
855 std::swap(d8, d2);
856 z = Fetch128(s + 80);
857 d7 = Xor(d7, z);
858 d8 = Shuf(kShuf, d8);
859 d1 = Shuf(kShuf, d1);
860 d0 = Add(d0, d7);
861 d2 = Add(d2, z);
862 d2 = Add(d2, d8);
863 std::swap(d1, d7);
864 z = Fetch128(s + 96);
865 d4 = Shuf(kShuf, d4);
866 d6 = Shuf(kShuf, d6);
867 d8 = Mul(kMult, d8);
868 d5 = Xor(d5, d11);
869 d7 = Xor(d7, z);
870 d7 = Add(d7, d4);
871 std::swap(d6, d0);
872 z = Fetch128(s + 112);
873 d8 = Add(d8, z);
874 d0 = Shuf(kShuf, d0);
875 d2 = Shuf(kShuf, d2);
876 d1 = Xor(d1, d8);
877 d10 = Xor(d10, z);
878 d10 = Xor(d10, d0);
879 std::swap(d11, d5);
880 z = Fetch128(s + 128);
881 d4 = Add(d4, z);
882 d5 = Shuf(kShuf, d5);
883 d7 = Shuf(kShuf, d7);
884 d6 = Add(d6, d4);
885 d8 = Xor(d8, z);
886 d8 = Xor(d8, d5);
887 std::swap(d4, d10);
888 z = Fetch128(s + 144);
889 d0 = Add(d0, z);
890 d1 = Shuf(kShuf, d1);
891 d2 = Add(d2, d0);
892 d4 = Xor(d4, z);
893 d4 = Xor(d4, d1);
894 z = Fetch128(s + 160);
895 d5 = Add(d5, z);
896 d6 = Shuf(kShuf, d6);
897 d8 = Shuf(kShuf, d8);
898 d7 = Xor(d7, d5);
899 d0 = Xor(d0, z);
900 d0 = Xor(d0, d6);
901 std::swap(d2, d8);
902 z = Fetch128(s + 176);
903 d1 = Add(d1, z);
904 d2 = Shuf(kShuf, d2);
905 d4 = Shuf(kShuf, d4);
906 d5 = Mul(kMult, d5);
907 d5 = Xor(d5, z);
908 d5 = Xor(d5, d2);
909 std::swap(d7, d1);
910 z = Fetch128(s + 192);
911 d6 = Add(d6, z);
912 d7 = Shuf(kShuf, d7);
913 d0 = Shuf(kShuf, d0);
914 d8 = Add(d8, d6);
915 d1 = Xor(d1, z);
916 d1 = Xor(d1, d7);
917 std::swap(d0, d6);
918 z = Fetch128(s + 208);
919 d2 = Add(d2, z);
920 d5 = Shuf(kShuf, d5);
921 d4 = Xor(d4, d2);
922 d6 = Xor(d6, z);
923 d6 = Xor(d6, d9);
924 std::swap(d5, d11);
925 z = Fetch128(s + 224);
926 d7 = Add(d7, z);
927 d8 = Shuf(kShuf, d8);
928 d1 = Shuf(kShuf, d1);
929 d0 = Xor(d0, d7);
930 d2 = Xor(d2, z);
931 d2 = Xor(d2, d8);
932 std::swap(d10, d4);
933 z = Fetch128(s + 240);
934 d3 = Add(d3, z);
935 d4 = Shuf(kShuf, d4);
936 d6 = Shuf(kShuf, d6);
937 d7 = Mul(kMult, d7);
938 d5 = Add(d5, d3);
939 d7 = Xor(d7, z);
940 d7 = Xor(d7, d4);
941 std::swap(d3, d9);
942 s += 256;
943 } while (s != end);
944 d6 = Add(Mul(kMult, d6), _mm_cvtsi64_si128(n));
945 if (n % 256 != 0) {
946 d7 = Add(_mm_shuffle_epi32(d8, (0 << 6) + (3 << 4) + (2 << 2) + (1 << 0)), d 7);
947 d8 = Add(Mul(kMult, d8), _mm_cvtsi64_si128(farmhashxo::Hash64(s, n % 256)));
948 }
949 __m128i t[8];
950 d0 = Mul(kMult, Shuf(kShuf, Mul(kMult, d0)));
951 d3 = Mul(kMult, Shuf(kShuf, Mul(kMult, d3)));
952 d9 = Mul(kMult, Shuf(kShuf, Mul(kMult, d9)));
953 d1 = Mul(kMult, Shuf(kShuf, Mul(kMult, d1)));
954 d0 = Add(d11, d0);
955 d3 = Xor(d7, d3);
956 d9 = Add(d8, d9);
957 d1 = Add(d10, d1);
958 d4 = Add(d3, d4);
959 d5 = Add(d9, d5);
960 d6 = Xor(d1, d6);
961 d2 = Add(d0, d2);
962 t[0] = d0;
963 t[1] = d3;
964 t[2] = d9;
965 t[3] = d1;
966 t[4] = d4;
967 t[5] = d5;
968 t[6] = d6;
969 t[7] = d2;
970 return farmhashxo::Hash64(reinterpret_cast<const char*>(t), sizeof(t));
971 }
972
973 uint64_t Hash64(const char *s, size_t len) {
974 // Empirically, farmhashxo seems faster until length 512.
975 return len >= 512 ? Hash64Long(s, len, k2, k1) : farmhashxo::Hash64(s, len);
976 }
977
978 uint64_t Hash64WithSeed(const char *s, size_t len, uint64_t seed) {
979 return len >= 512 ? Hash64Long(s, len, k1, seed) :
980 farmhashxo::Hash64WithSeed(s, len, seed);
981 }
982
983 uint64_t Hash64WithSeeds(const char *s, size_t len, uint64_t seed0, uint64_t see d1) {
984 return len >= 512 ? Hash64Long(s, len, seed0, seed1) :
985 farmhashxo::Hash64WithSeeds(s, len, seed0, seed1);
986 }
987
988 #endif
989 } // namespace farmhashte
990 namespace farmhashnt {
991 #if !can_use_sse41 || !x86_64
992
993 uint32_t Hash32(const char *s, size_t len) {
994 FARMHASH_DIE_IF_MISCONFIGURED;
995 return s == NULL ? 0 : len;
996 }
997
998 uint32_t Hash32WithSeed(const char *s, size_t len, uint32_t seed) {
999 FARMHASH_DIE_IF_MISCONFIGURED;
1000 return seed + Hash32(s, len);
1001 }
1002
1003 #else
1004
1005 uint32_t Hash32(const char *s, size_t len) {
1006 return static_cast<uint32_t>(farmhashte::Hash64(s, len));
1007 }
1008
1009 uint32_t Hash32WithSeed(const char *s, size_t len, uint32_t seed) {
1010 return static_cast<uint32_t>(farmhashte::Hash64WithSeed(s, len, seed));
1011 }
1012
1013 #endif
1014 } // namespace farmhashnt
1015 namespace farmhashmk {
1016 #undef Fetch
1017 #define Fetch Fetch32
1018
1019 #undef Rotate
1020 #define Rotate Rotate32
1021
1022 #undef Bswap
1023 #define Bswap Bswap32
1024
1025 STATIC_INLINE uint32_t Hash32Len13to24(const char *s, size_t len, uint32_t seed = 0) {
1026 uint32_t a = Fetch(s - 4 + (len >> 1));
1027 uint32_t b = Fetch(s + 4);
1028 uint32_t c = Fetch(s + len - 8);
1029 uint32_t d = Fetch(s + (len >> 1));
1030 uint32_t e = Fetch(s);
1031 uint32_t f = Fetch(s + len - 4);
1032 uint32_t h = d * c1 + len + seed;
1033 a = Rotate(a, 12) + f;
1034 h = Mur(c, h) + a;
1035 a = Rotate(a, 3) + c;
1036 h = Mur(e, h) + a;
1037 a = Rotate(a + f, 12) + d;
1038 h = Mur(b ^ seed, h) + a;
1039 return fmix(h);
1040 }
1041
1042 STATIC_INLINE uint32_t Hash32Len0to4(const char *s, size_t len, uint32_t seed = 0) {
1043 uint32_t b = seed;
1044 uint32_t c = 9;
1045 for (size_t i = 0; i < len; i++) {
1046 signed char v = s[i];
1047 b = b * c1 + v;
1048 c ^= b;
1049 }
1050 return fmix(Mur(b, Mur(len, c)));
1051 }
1052
1053 STATIC_INLINE uint32_t Hash32Len5to12(const char *s, size_t len, uint32_t seed = 0) {
1054 uint32_t a = len, b = len * 5, c = 9, d = b + seed;
1055 a += Fetch(s);
1056 b += Fetch(s + len - 4);
1057 c += Fetch(s + ((len >> 1) & 4));
1058 return fmix(seed ^ Mur(c, Mur(b, Mur(a, d))));
1059 }
1060
1061 uint32_t Hash32(const char *s, size_t len) {
1062 if (len <= 24) {
1063 return len <= 12 ?
1064 (len <= 4 ? Hash32Len0to4(s, len) : Hash32Len5to12(s, len)) :
1065 Hash32Len13to24(s, len);
1066 }
1067
1068 // len > 24
1069 uint32_t h = len, g = c1 * len, f = g;
1070 uint32_t a0 = Rotate(Fetch(s + len - 4) * c1, 17) * c2;
1071 uint32_t a1 = Rotate(Fetch(s + len - 8) * c1, 17) * c2;
1072 uint32_t a2 = Rotate(Fetch(s + len - 16) * c1, 17) * c2;
1073 uint32_t a3 = Rotate(Fetch(s + len - 12) * c1, 17) * c2;
1074 uint32_t a4 = Rotate(Fetch(s + len - 20) * c1, 17) * c2;
1075 h ^= a0;
1076 h = Rotate(h, 19);
1077 h = h * 5 + 0xe6546b64;
1078 h ^= a2;
1079 h = Rotate(h, 19);
1080 h = h * 5 + 0xe6546b64;
1081 g ^= a1;
1082 g = Rotate(g, 19);
1083 g = g * 5 + 0xe6546b64;
1084 g ^= a3;
1085 g = Rotate(g, 19);
1086 g = g * 5 + 0xe6546b64;
1087 f += a4;
1088 f = Rotate(f, 19) + 113;
1089 size_t iters = (len - 1) / 20;
1090 do {
1091 uint32_t a = Fetch(s);
1092 uint32_t b = Fetch(s + 4);
1093 uint32_t c = Fetch(s + 8);
1094 uint32_t d = Fetch(s + 12);
1095 uint32_t e = Fetch(s + 16);
1096 h += a;
1097 g += b;
1098 f += c;
1099 h = Mur(d, h) + e;
1100 g = Mur(c, g) + a;
1101 f = Mur(b + e * c1, f) + d;
1102 f += g;
1103 g += f;
1104 s += 20;
1105 } while (--iters != 0);
1106 g = Rotate(g, 11) * c1;
1107 g = Rotate(g, 17) * c1;
1108 f = Rotate(f, 11) * c1;
1109 f = Rotate(f, 17) * c1;
1110 h = Rotate(h + g, 19);
1111 h = h * 5 + 0xe6546b64;
1112 h = Rotate(h, 17) * c1;
1113 h = Rotate(h + f, 19);
1114 h = h * 5 + 0xe6546b64;
1115 h = Rotate(h, 17) * c1;
1116 return h;
1117 }
1118
1119 uint32_t Hash32WithSeed(const char *s, size_t len, uint32_t seed) {
1120 if (len <= 24) {
1121 if (len >= 13) return Hash32Len13to24(s, len, seed * c1);
1122 else if (len >= 5) return Hash32Len5to12(s, len, seed);
1123 else return Hash32Len0to4(s, len, seed);
1124 }
1125 uint32_t h = Hash32Len13to24(s, 24, seed ^ len);
1126 return Mur(Hash32(s + 24, len - 24) + seed, h);
1127 }
1128 } // namespace farmhashmk
1129 namespace farmhashsu {
1130 #if !can_use_sse42 || !can_use_aesni
1131
1132 uint32_t Hash32(const char *s, size_t len) {
1133 FARMHASH_DIE_IF_MISCONFIGURED;
1134 return s == NULL ? 0 : len;
1135 }
1136
1137 uint32_t Hash32WithSeed(const char *s, size_t len, uint32_t seed) {
1138 FARMHASH_DIE_IF_MISCONFIGURED;
1139 return seed + Hash32(s, len);
1140 }
1141
1142 #else
1143
1144 #undef Fetch
1145 #define Fetch Fetch32
1146
1147 #undef Rotate
1148 #define Rotate Rotate32
1149
1150 #undef Bswap
1151 #define Bswap Bswap32
1152
1153 // Helpers for data-parallel operations (4x 32-bits).
1154 STATIC_INLINE __m128i Add(__m128i x, __m128i y) { return _mm_add_epi32(x, y); }
1155 STATIC_INLINE __m128i Xor(__m128i x, __m128i y) { return _mm_xor_si128(x, y); }
1156 STATIC_INLINE __m128i Or(__m128i x, __m128i y) { return _mm_or_si128(x, y); }
1157 STATIC_INLINE __m128i Mul(__m128i x, __m128i y) { return _mm_mullo_epi32(x, y); }
1158 STATIC_INLINE __m128i Mul5(__m128i x) { return Add(x, _mm_slli_epi32(x, 2)); }
1159 STATIC_INLINE __m128i RotateLeft(__m128i x, int c) {
1160 return Or(_mm_slli_epi32(x, c),
1161 _mm_srli_epi32(x, 32 - c));
1162 }
1163 STATIC_INLINE __m128i Rol17(__m128i x) { return RotateLeft(x, 17); }
1164 STATIC_INLINE __m128i Rol19(__m128i x) { return RotateLeft(x, 19); }
1165 STATIC_INLINE __m128i Shuffle0321(__m128i x) {
1166 return _mm_shuffle_epi32(x, (0 << 6) + (3 << 4) + (2 << 2) + (1 << 0));
1167 }
1168
1169 uint32_t Hash32(const char *s, size_t len) {
1170 const uint32_t seed = 81;
1171 if (len <= 24) {
1172 return len <= 12 ?
1173 (len <= 4 ?
1174 farmhashmk::Hash32Len0to4(s, len) :
1175 farmhashmk::Hash32Len5to12(s, len)) :
1176 farmhashmk::Hash32Len13to24(s, len);
1177 }
1178
1179 if (len < 40) {
1180 uint32_t a = len, b = seed * c2, c = a + b;
1181 a += Fetch(s + len - 4);
1182 b += Fetch(s + len - 20);
1183 c += Fetch(s + len - 16);
1184 uint32_t d = a;
1185 a = NAMESPACE_FOR_HASH_FUNCTIONS::Rotate32(a, 21);
1186 a = Mur(a, Mur(b, _mm_crc32_u32(c, d)));
1187 a += Fetch(s + len - 12);
1188 b += Fetch(s + len - 8);
1189 d += a;
1190 a += d;
1191 b = Mur(b, d) * c2;
1192 a = _mm_crc32_u32(a, b + c);
1193 return farmhashmk::Hash32Len13to24(s, (len + 1) / 2, a) + b;
1194 }
1195
1196 #undef Mulc1
1197 #define Mulc1(x) Mul((x), cc1)
1198
1199 #undef Mulc2
1200 #define Mulc2(x) Mul((x), cc2)
1201
1202 #undef Murk
1203 #define Murk(a, h) \
1204 Add(k, \
1205 Mul5( \
1206 Rol19( \
1207 Xor( \
1208 Mulc2( \
1209 Rol17( \
1210 Mulc1(a))), \
1211 (h)))))
1212
1213 const __m128i cc1 = _mm_set1_epi32(c1);
1214 const __m128i cc2 = _mm_set1_epi32(c2);
1215 __m128i h = _mm_set1_epi32(seed);
1216 __m128i g = _mm_set1_epi32(c1 * seed);
1217 __m128i f = g;
1218 __m128i k = _mm_set1_epi32(0xe6546b64);
1219 __m128i q;
1220 if (len < 80) {
1221 __m128i a = Fetch128(s);
1222 __m128i b = Fetch128(s + 16);
1223 __m128i c = Fetch128(s + (len - 15) / 2);
1224 __m128i d = Fetch128(s + len - 32);
1225 __m128i e = Fetch128(s + len - 16);
1226 h = Add(h, a);
1227 g = Add(g, b);
1228 q = g;
1229 g = Shuffle0321(g);
1230 f = Add(f, c);
1231 __m128i be = Add(b, Mulc1(e));
1232 h = Add(h, f);
1233 f = Add(f, h);
1234 h = Add(Murk(d, h), e);
1235 k = Xor(k, _mm_shuffle_epi8(g, f));
1236 g = Add(Xor(c, g), a);
1237 f = Add(Xor(be, f), d);
1238 k = Add(k, be);
1239 k = Add(k, _mm_shuffle_epi8(f, h));
1240 f = Add(f, g);
1241 g = Add(g, f);
1242 g = Add(_mm_set1_epi32(len), Mulc1(g));
1243 } else {
1244 // len >= 80
1245 // The following is loosely modelled after farmhashmk::Hash32.
1246 size_t iters = (len - 1) / 80;
1247 len -= iters * 80;
1248
1249 #undef Chunk
1250 #define Chunk() do { \
1251 __m128i a = Fetch128(s); \
1252 __m128i b = Fetch128(s + 16); \
1253 __m128i c = Fetch128(s + 32); \
1254 __m128i d = Fetch128(s + 48); \
1255 __m128i e = Fetch128(s + 64); \
1256 h = Add(h, a); \
1257 g = Add(g, b); \
1258 g = Shuffle0321(g); \
1259 f = Add(f, c); \
1260 __m128i be = Add(b, Mulc1(e)); \
1261 h = Add(h, f); \
1262 f = Add(f, h); \
1263 h = Add(h, d); \
1264 q = Add(q, e); \
1265 h = Rol17(h); \
1266 h = Mulc1(h); \
1267 k = Xor(k, _mm_shuffle_epi8(g, f)); \
1268 g = Add(Xor(c, g), a); \
1269 f = Add(Xor(be, f), d); \
1270 std::swap(f, q); \
1271 q = _mm_aesimc_si128(q); \
1272 k = Add(k, be); \
1273 k = Add(k, _mm_shuffle_epi8(f, h)); \
1274 f = Add(f, g); \
1275 g = Add(g, f); \
1276 f = Mulc1(f); \
1277 } while (0)
1278
1279 q = g;
1280 while (iters-- != 0) {
1281 Chunk();
1282 s += 80;
1283 }
1284
1285 if (len != 0) {
1286 h = Add(h, _mm_set1_epi32(len));
1287 s = s + len - 80;
1288 Chunk();
1289 }
1290 }
1291
1292 g = Shuffle0321(g);
1293 k = Xor(k, g);
1294 k = Xor(k, q);
1295 h = Xor(h, q);
1296 f = Mulc1(f);
1297 k = Mulc2(k);
1298 g = Mulc1(g);
1299 h = Mulc2(h);
1300 k = Add(k, _mm_shuffle_epi8(g, f));
1301 h = Add(h, f);
1302 f = Add(f, h);
1303 g = Add(g, k);
1304 k = Add(k, g);
1305 k = Xor(k, _mm_shuffle_epi8(f, h));
1306 __m128i buf[4];
1307 buf[0] = f;
1308 buf[1] = g;
1309 buf[2] = k;
1310 buf[3] = h;
1311 s = reinterpret_cast<char*>(buf);
1312 uint32_t x = Fetch(s);
1313 uint32_t y = Fetch(s+4);
1314 uint32_t z = Fetch(s+8);
1315 x = _mm_crc32_u32(x, Fetch(s+12));
1316 y = _mm_crc32_u32(y, Fetch(s+16));
1317 z = _mm_crc32_u32(z * c1, Fetch(s+20));
1318 x = _mm_crc32_u32(x, Fetch(s+24));
1319 y = _mm_crc32_u32(y * c1, Fetch(s+28));
1320 uint32_t o = y;
1321 z = _mm_crc32_u32(z, Fetch(s+32));
1322 x = _mm_crc32_u32(x * c1, Fetch(s+36));
1323 y = _mm_crc32_u32(y, Fetch(s+40));
1324 z = _mm_crc32_u32(z * c1, Fetch(s+44));
1325 x = _mm_crc32_u32(x, Fetch(s+48));
1326 y = _mm_crc32_u32(y * c1, Fetch(s+52));
1327 z = _mm_crc32_u32(z, Fetch(s+56));
1328 x = _mm_crc32_u32(x, Fetch(s+60));
1329 return (o - x + y - z) * c1;
1330 }
1331
1332 #undef Chunk
1333 #undef Murk
1334 #undef Mulc2
1335 #undef Mulc1
1336
1337 uint32_t Hash32WithSeed(const char *s, size_t len, uint32_t seed) {
1338 if (len <= 24) {
1339 if (len >= 13) return farmhashmk::Hash32Len13to24(s, len, seed * c1);
1340 else if (len >= 5) return farmhashmk::Hash32Len5to12(s, len, seed);
1341 else return farmhashmk::Hash32Len0to4(s, len, seed);
1342 }
1343 uint32_t h = farmhashmk::Hash32Len13to24(s, 24, seed ^ len);
1344 return _mm_crc32_u32(Hash32(s + 24, len - 24) + seed, h);
1345 }
1346
1347 #endif
1348 } // namespace farmhashsu
1349 namespace farmhashsa {
1350 #if !can_use_sse42
1351
1352 uint32_t Hash32(const char *s, size_t len) {
1353 FARMHASH_DIE_IF_MISCONFIGURED;
1354 return s == NULL ? 0 : len;
1355 }
1356
1357 uint32_t Hash32WithSeed(const char *s, size_t len, uint32_t seed) {
1358 FARMHASH_DIE_IF_MISCONFIGURED;
1359 return seed + Hash32(s, len);
1360 }
1361
1362 #else
1363
1364 #undef Fetch
1365 #define Fetch Fetch32
1366
1367 #undef Rotate
1368 #define Rotate Rotate32
1369
1370 #undef Bswap
1371 #define Bswap Bswap32
1372
1373 // Helpers for data-parallel operations (4x 32-bits).
1374 STATIC_INLINE __m128i Add(__m128i x, __m128i y) { return _mm_add_epi32(x, y); }
1375 STATIC_INLINE __m128i Xor(__m128i x, __m128i y) { return _mm_xor_si128(x, y); }
1376 STATIC_INLINE __m128i Or(__m128i x, __m128i y) { return _mm_or_si128(x, y); }
1377 STATIC_INLINE __m128i Mul(__m128i x, __m128i y) { return _mm_mullo_epi32(x, y); }
1378 STATIC_INLINE __m128i Mul5(__m128i x) { return Add(x, _mm_slli_epi32(x, 2)); }
1379 STATIC_INLINE __m128i Rotate(__m128i x, int c) {
1380 return Or(_mm_slli_epi32(x, c),
1381 _mm_srli_epi32(x, 32 - c));
1382 }
1383 STATIC_INLINE __m128i Rot17(__m128i x) { return Rotate(x, 17); }
1384 STATIC_INLINE __m128i Rot19(__m128i x) { return Rotate(x, 19); }
1385 STATIC_INLINE __m128i Shuffle0321(__m128i x) {
1386 return _mm_shuffle_epi32(x, (0 << 6) + (3 << 4) + (2 << 2) + (1 << 0));
1387 }
1388
1389 uint32_t Hash32(const char *s, size_t len) {
1390 const uint32_t seed = 81;
1391 if (len <= 24) {
1392 return len <= 12 ?
1393 (len <= 4 ?
1394 farmhashmk::Hash32Len0to4(s, len) :
1395 farmhashmk::Hash32Len5to12(s, len)) :
1396 farmhashmk::Hash32Len13to24(s, len);
1397 }
1398
1399 if (len < 40) {
1400 uint32_t a = len, b = seed * c2, c = a + b;
1401 a += Fetch(s + len - 4);
1402 b += Fetch(s + len - 20);
1403 c += Fetch(s + len - 16);
1404 uint32_t d = a;
1405 a = NAMESPACE_FOR_HASH_FUNCTIONS::Rotate32(a, 21);
1406 a = Mur(a, Mur(b, Mur(c, d)));
1407 a += Fetch(s + len - 12);
1408 b += Fetch(s + len - 8);
1409 d += a;
1410 a += d;
1411 b = Mur(b, d) * c2;
1412 a = _mm_crc32_u32(a, b + c);
1413 return farmhashmk::Hash32Len13to24(s, (len + 1) / 2, a) + b;
1414 }
1415
1416 #undef Mulc1
1417 #define Mulc1(x) Mul((x), cc1)
1418
1419 #undef Mulc2
1420 #define Mulc2(x) Mul((x), cc2)
1421
1422 #undef Murk
1423 #define Murk(a, h) \
1424 Add(k, \
1425 Mul5( \
1426 Rot19( \
1427 Xor( \
1428 Mulc2( \
1429 Rot17( \
1430 Mulc1(a))), \
1431 (h)))))
1432
1433 const __m128i cc1 = _mm_set1_epi32(c1);
1434 const __m128i cc2 = _mm_set1_epi32(c2);
1435 __m128i h = _mm_set1_epi32(seed);
1436 __m128i g = _mm_set1_epi32(c1 * seed);
1437 __m128i f = g;
1438 __m128i k = _mm_set1_epi32(0xe6546b64);
1439 if (len < 80) {
1440 __m128i a = Fetch128(s);
1441 __m128i b = Fetch128(s + 16);
1442 __m128i c = Fetch128(s + (len - 15) / 2);
1443 __m128i d = Fetch128(s + len - 32);
1444 __m128i e = Fetch128(s + len - 16);
1445 h = Add(h, a);
1446 g = Add(g, b);
1447 g = Shuffle0321(g);
1448 f = Add(f, c);
1449 __m128i be = Add(b, Mulc1(e));
1450 h = Add(h, f);
1451 f = Add(f, h);
1452 h = Add(Murk(d, h), e);
1453 k = Xor(k, _mm_shuffle_epi8(g, f));
1454 g = Add(Xor(c, g), a);
1455 f = Add(Xor(be, f), d);
1456 k = Add(k, be);
1457 k = Add(k, _mm_shuffle_epi8(f, h));
1458 f = Add(f, g);
1459 g = Add(g, f);
1460 g = Add(_mm_set1_epi32(len), Mulc1(g));
1461 } else {
1462 // len >= 80
1463 // The following is loosely modelled after farmhashmk::Hash32.
1464 size_t iters = (len - 1) / 80;
1465 len -= iters * 80;
1466
1467 #undef Chunk
1468 #define Chunk() do { \
1469 __m128i a = Fetch128(s); \
1470 __m128i b = Fetch128(s + 16); \
1471 __m128i c = Fetch128(s + 32); \
1472 __m128i d = Fetch128(s + 48); \
1473 __m128i e = Fetch128(s + 64); \
1474 h = Add(h, a); \
1475 g = Add(g, b); \
1476 g = Shuffle0321(g); \
1477 f = Add(f, c); \
1478 __m128i be = Add(b, Mulc1(e)); \
1479 h = Add(h, f); \
1480 f = Add(f, h); \
1481 h = Add(Murk(d, h), e); \
1482 k = Xor(k, _mm_shuffle_epi8(g, f)); \
1483 g = Add(Xor(c, g), a); \
1484 f = Add(Xor(be, f), d); \
1485 k = Add(k, be); \
1486 k = Add(k, _mm_shuffle_epi8(f, h)); \
1487 f = Add(f, g); \
1488 g = Add(g, f); \
1489 f = Mulc1(f); \
1490 } while (0)
1491
1492 while (iters-- != 0) {
1493 Chunk();
1494 s += 80;
1495 }
1496
1497 if (len != 0) {
1498 h = Add(h, _mm_set1_epi32(len));
1499 s = s + len - 80;
1500 Chunk();
1501 }
1502 }
1503
1504 g = Shuffle0321(g);
1505 k = Xor(k, g);
1506 f = Mulc1(f);
1507 k = Mulc2(k);
1508 g = Mulc1(g);
1509 h = Mulc2(h);
1510 k = Add(k, _mm_shuffle_epi8(g, f));
1511 h = Add(h, f);
1512 f = Add(f, h);
1513 g = Add(g, k);
1514 k = Add(k, g);
1515 k = Xor(k, _mm_shuffle_epi8(f, h));
1516 __m128i buf[4];
1517 buf[0] = f;
1518 buf[1] = g;
1519 buf[2] = k;
1520 buf[3] = h;
1521 s = reinterpret_cast<char*>(buf);
1522 uint32_t x = Fetch(s);
1523 uint32_t y = Fetch(s+4);
1524 uint32_t z = Fetch(s+8);
1525 x = _mm_crc32_u32(x, Fetch(s+12));
1526 y = _mm_crc32_u32(y, Fetch(s+16));
1527 z = _mm_crc32_u32(z * c1, Fetch(s+20));
1528 x = _mm_crc32_u32(x, Fetch(s+24));
1529 y = _mm_crc32_u32(y * c1, Fetch(s+28));
1530 uint32_t o = y;
1531 z = _mm_crc32_u32(z, Fetch(s+32));
1532 x = _mm_crc32_u32(x * c1, Fetch(s+36));
1533 y = _mm_crc32_u32(y, Fetch(s+40));
1534 z = _mm_crc32_u32(z * c1, Fetch(s+44));
1535 x = _mm_crc32_u32(x, Fetch(s+48));
1536 y = _mm_crc32_u32(y * c1, Fetch(s+52));
1537 z = _mm_crc32_u32(z, Fetch(s+56));
1538 x = _mm_crc32_u32(x, Fetch(s+60));
1539 return (o - x + y - z) * c1;
1540 }
1541
1542 #undef Chunk
1543 #undef Murk
1544 #undef Mulc2
1545 #undef Mulc1
1546
1547 uint32_t Hash32WithSeed(const char *s, size_t len, uint32_t seed) {
1548 if (len <= 24) {
1549 if (len >= 13) return farmhashmk::Hash32Len13to24(s, len, seed * c1);
1550 else if (len >= 5) return farmhashmk::Hash32Len5to12(s, len, seed);
1551 else return farmhashmk::Hash32Len0to4(s, len, seed);
1552 }
1553 uint32_t h = farmhashmk::Hash32Len13to24(s, 24, seed ^ len);
1554 return _mm_crc32_u32(Hash32(s + 24, len - 24) + seed, h);
1555 }
1556
1557 #endif
1558 } // namespace farmhashsa
1559 namespace farmhashcc {
1560 // This file provides a 32-bit hash equivalent to CityHash32 (v1.1.1)
1561 // and a 128-bit hash equivalent to CityHash128 (v1.1.1). It also provides
1562 // a seeded 32-bit hash function similar to CityHash32.
1563
1564 #undef Fetch
1565 #define Fetch Fetch32
1566
1567 #undef Rotate
1568 #define Rotate Rotate32
1569
1570 #undef Bswap
1571 #define Bswap Bswap32
1572
1573 STATIC_INLINE uint32_t Hash32Len13to24(const char *s, size_t len) {
1574 uint32_t a = Fetch(s - 4 + (len >> 1));
1575 uint32_t b = Fetch(s + 4);
1576 uint32_t c = Fetch(s + len - 8);
1577 uint32_t d = Fetch(s + (len >> 1));
1578 uint32_t e = Fetch(s);
1579 uint32_t f = Fetch(s + len - 4);
1580 uint32_t h = len;
1581
1582 return fmix(Mur(f, Mur(e, Mur(d, Mur(c, Mur(b, Mur(a, h)))))));
1583 }
1584
1585 STATIC_INLINE uint32_t Hash32Len0to4(const char *s, size_t len) {
1586 uint32_t b = 0;
1587 uint32_t c = 9;
1588 for (size_t i = 0; i < len; i++) {
1589 signed char v = s[i];
1590 b = b * c1 + v;
1591 c ^= b;
1592 }
1593 return fmix(Mur(b, Mur(len, c)));
1594 }
1595
1596 STATIC_INLINE uint32_t Hash32Len5to12(const char *s, size_t len) {
1597 uint32_t a = len, b = len * 5, c = 9, d = b;
1598 a += Fetch(s);
1599 b += Fetch(s + len - 4);
1600 c += Fetch(s + ((len >> 1) & 4));
1601 return fmix(Mur(c, Mur(b, Mur(a, d))));
1602 }
1603
1604 uint32_t Hash32(const char *s, size_t len) {
1605 if (len <= 24) {
1606 return len <= 12 ?
1607 (len <= 4 ? Hash32Len0to4(s, len) : Hash32Len5to12(s, len)) :
1608 Hash32Len13to24(s, len);
1609 }
1610
1611 // len > 24
1612 uint32_t h = len, g = c1 * len, f = g;
1613 uint32_t a0 = Rotate(Fetch(s + len - 4) * c1, 17) * c2;
1614 uint32_t a1 = Rotate(Fetch(s + len - 8) * c1, 17) * c2;
1615 uint32_t a2 = Rotate(Fetch(s + len - 16) * c1, 17) * c2;
1616 uint32_t a3 = Rotate(Fetch(s + len - 12) * c1, 17) * c2;
1617 uint32_t a4 = Rotate(Fetch(s + len - 20) * c1, 17) * c2;
1618 h ^= a0;
1619 h = Rotate(h, 19);
1620 h = h * 5 + 0xe6546b64;
1621 h ^= a2;
1622 h = Rotate(h, 19);
1623 h = h * 5 + 0xe6546b64;
1624 g ^= a1;
1625 g = Rotate(g, 19);
1626 g = g * 5 + 0xe6546b64;
1627 g ^= a3;
1628 g = Rotate(g, 19);
1629 g = g * 5 + 0xe6546b64;
1630 f += a4;
1631 f = Rotate(f, 19);
1632 f = f * 5 + 0xe6546b64;
1633 size_t iters = (len - 1) / 20;
1634 do {
1635 uint32_t a0 = Rotate(Fetch(s) * c1, 17) * c2;
1636 uint32_t a1 = Fetch(s + 4);
1637 uint32_t a2 = Rotate(Fetch(s + 8) * c1, 17) * c2;
1638 uint32_t a3 = Rotate(Fetch(s + 12) * c1, 17) * c2;
1639 uint32_t a4 = Fetch(s + 16);
1640 h ^= a0;
1641 h = Rotate(h, 18);
1642 h = h * 5 + 0xe6546b64;
1643 f += a1;
1644 f = Rotate(f, 19);
1645 f = f * c1;
1646 g += a2;
1647 g = Rotate(g, 18);
1648 g = g * 5 + 0xe6546b64;
1649 h ^= a3 + a1;
1650 h = Rotate(h, 19);
1651 h = h * 5 + 0xe6546b64;
1652 g ^= a4;
1653 g = Bswap(g) * 5;
1654 h += a4 * 5;
1655 h = Bswap(h);
1656 f += a0;
1657 PERMUTE3(f, h, g);
1658 s += 20;
1659 } while (--iters != 0);
1660 g = Rotate(g, 11) * c1;
1661 g = Rotate(g, 17) * c1;
1662 f = Rotate(f, 11) * c1;
1663 f = Rotate(f, 17) * c1;
1664 h = Rotate(h + g, 19);
1665 h = h * 5 + 0xe6546b64;
1666 h = Rotate(h, 17) * c1;
1667 h = Rotate(h + f, 19);
1668 h = h * 5 + 0xe6546b64;
1669 h = Rotate(h, 17) * c1;
1670 return h;
1671 }
1672
1673 uint32_t Hash32WithSeed(const char *s, size_t len, uint32_t seed) {
1674 if (len <= 24) {
1675 if (len >= 13) return farmhashmk::Hash32Len13to24(s, len, seed * c1);
1676 else if (len >= 5) return farmhashmk::Hash32Len5to12(s, len, seed);
1677 else return farmhashmk::Hash32Len0to4(s, len, seed);
1678 }
1679 uint32_t h = farmhashmk::Hash32Len13to24(s, 24, seed ^ len);
1680 return Mur(Hash32(s + 24, len - 24) + seed, h);
1681 }
1682
1683 #undef Fetch
1684 #define Fetch Fetch64
1685
1686 #undef Rotate
1687 #define Rotate Rotate64
1688
1689 #undef Bswap
1690 #define Bswap Bswap64
1691
1692 STATIC_INLINE uint64_t ShiftMix(uint64_t val) {
1693 return val ^ (val >> 47);
1694 }
1695
1696 STATIC_INLINE uint64_t HashLen16(uint64_t u, uint64_t v) {
1697 return Hash128to64(Uint128(u, v));
1698 }
1699
1700 STATIC_INLINE uint64_t HashLen16(uint64_t u, uint64_t v, uint64_t mul) {
1701 // Murmur-inspired hashing.
1702 uint64_t a = (u ^ v) * mul;
1703 a ^= (a >> 47);
1704 uint64_t b = (v ^ a) * mul;
1705 b ^= (b >> 47);
1706 b *= mul;
1707 return b;
1708 }
1709
1710 STATIC_INLINE uint64_t HashLen0to16(const char *s, size_t len) {
1711 if (len >= 8) {
1712 uint64_t mul = k2 + len * 2;
1713 uint64_t a = Fetch(s) + k2;
1714 uint64_t b = Fetch(s + len - 8);
1715 uint64_t c = Rotate(b, 37) * mul + a;
1716 uint64_t d = (Rotate(a, 25) + b) * mul;
1717 return HashLen16(c, d, mul);
1718 }
1719 if (len >= 4) {
1720 uint64_t mul = k2 + len * 2;
1721 uint64_t a = Fetch32(s);
1722 return HashLen16(len + (a << 3), Fetch32(s + len - 4), mul);
1723 }
1724 if (len > 0) {
1725 uint8_t a = s[0];
1726 uint8_t b = s[len >> 1];
1727 uint8_t c = s[len - 1];
1728 uint32_t y = static_cast<uint32_t>(a) + (static_cast<uint32_t>(b) << 8);
1729 uint32_t z = len + (static_cast<uint32_t>(c) << 2);
1730 return ShiftMix(y * k2 ^ z * k0) * k2;
1731 }
1732 return k2;
1733 }
1734
1735 // Return a 16-byte hash for 48 bytes. Quick and dirty.
1736 // Callers do best to use "random-looking" values for a and b.
1737 STATIC_INLINE pair<uint64_t, uint64_t> WeakHashLen32WithSeeds(
1738 uint64_t w, uint64_t x, uint64_t y, uint64_t z, uint64_t a, uint64_t b) {
1739 a += w;
1740 b = Rotate(b + a + z, 21);
1741 uint64_t c = a;
1742 a += x;
1743 a += y;
1744 b += Rotate(a, 44);
1745 return make_pair(a + z, b + c);
1746 }
1747
1748 // Return a 16-byte hash for s[0] ... s[31], a, and b. Quick and dirty.
1749 STATIC_INLINE pair<uint64_t, uint64_t> WeakHashLen32WithSeeds(
1750 const char* s, uint64_t a, uint64_t b) {
1751 return WeakHashLen32WithSeeds(Fetch(s),
1752 Fetch(s + 8),
1753 Fetch(s + 16),
1754 Fetch(s + 24),
1755 a,
1756 b);
1757 }
1758
1759
1760
1761 // A subroutine for CityHash128(). Returns a decent 128-bit hash for strings
1762 // of any length representable in signed long. Based on City and Murmur.
1763 STATIC_INLINE uint128_t CityMurmur(const char *s, size_t len, uint128_t seed) {
1764 uint64_t a = Uint128Low64(seed);
1765 uint64_t b = Uint128High64(seed);
1766 uint64_t c = 0;
1767 uint64_t d = 0;
1768 signed long l = len - 16;
1769 if (l <= 0) { // len <= 16
1770 a = ShiftMix(a * k1) * k1;
1771 c = b * k1 + HashLen0to16(s, len);
1772 d = ShiftMix(a + (len >= 8 ? Fetch(s) : c));
1773 } else { // len > 16
1774 c = HashLen16(Fetch(s + len - 8) + k1, a);
1775 d = HashLen16(b + len, c + Fetch(s + len - 16));
1776 a += d;
1777 do {
1778 a ^= ShiftMix(Fetch(s) * k1) * k1;
1779 a *= k1;
1780 b ^= a;
1781 c ^= ShiftMix(Fetch(s + 8) * k1) * k1;
1782 c *= k1;
1783 d ^= c;
1784 s += 16;
1785 l -= 16;
1786 } while (l > 0);
1787 }
1788 a = HashLen16(a, c);
1789 b = HashLen16(d, b);
1790 return uint128_t(a ^ b, HashLen16(b, a));
1791 }
1792
1793 uint128_t CityHash128WithSeed(const char *s, size_t len, uint128_t seed) {
1794 if (len < 128) {
1795 return CityMurmur(s, len, seed);
1796 }
1797
1798 // We expect len >= 128 to be the common case. Keep 56 bytes of state:
1799 // v, w, x, y, and z.
1800 pair<uint64_t, uint64_t> v, w;
1801 uint64_t x = Uint128Low64(seed);
1802 uint64_t y = Uint128High64(seed);
1803 uint64_t z = len * k1;
1804 v.first = Rotate(y ^ k1, 49) * k1 + Fetch(s);
1805 v.second = Rotate(v.first, 42) * k1 + Fetch(s + 8);
1806 w.first = Rotate(y + z, 35) * k1 + x;
1807 w.second = Rotate(x + Fetch(s + 88), 53) * k1;
1808
1809 // This is the same inner loop as CityHash64(), manually unrolled.
1810 do {
1811 x = Rotate(x + y + v.first + Fetch(s + 8), 37) * k1;
1812 y = Rotate(y + v.second + Fetch(s + 48), 42) * k1;
1813 x ^= w.second;
1814 y += v.first + Fetch(s + 40);
1815 z = Rotate(z + w.first, 33) * k1;
1816 v = WeakHashLen32WithSeeds(s, v.second * k1, x + w.first);
1817 w = WeakHashLen32WithSeeds(s + 32, z + w.second, y + Fetch(s + 16));
1818 std::swap(z, x);
1819 s += 64;
1820 x = Rotate(x + y + v.first + Fetch(s + 8), 37) * k1;
1821 y = Rotate(y + v.second + Fetch(s + 48), 42) * k1;
1822 x ^= w.second;
1823 y += v.first + Fetch(s + 40);
1824 z = Rotate(z + w.first, 33) * k1;
1825 v = WeakHashLen32WithSeeds(s, v.second * k1, x + w.first);
1826 w = WeakHashLen32WithSeeds(s + 32, z + w.second, y + Fetch(s + 16));
1827 std::swap(z, x);
1828 s += 64;
1829 len -= 128;
1830 } while (LIKELY(len >= 128));
1831 x += Rotate(v.first + z, 49) * k0;
1832 y = y * k0 + Rotate(w.second, 37);
1833 z = z * k0 + Rotate(w.first, 27);
1834 w.first *= 9;
1835 v.first *= k0;
1836 // If 0 < len < 128, hash up to 4 chunks of 32 bytes each from the end of s.
1837 for (size_t tail_done = 0; tail_done < len; ) {
1838 tail_done += 32;
1839 y = Rotate(x + y, 42) * k0 + v.second;
1840 w.first += Fetch(s + len - tail_done + 16);
1841 x = x * k0 + w.first;
1842 z += w.second + Fetch(s + len - tail_done);
1843 w.second += v.first;
1844 v = WeakHashLen32WithSeeds(s + len - tail_done, v.first + z, v.second);
1845 v.first *= k0;
1846 }
1847 // At this point our 56 bytes of state should contain more than
1848 // enough information for a strong 128-bit hash. We use two
1849 // different 56-byte-to-8-byte hashes to get a 16-byte final result.
1850 x = HashLen16(x, v.first);
1851 y = HashLen16(y + z, w.first);
1852 return uint128_t(HashLen16(x + v.second, w.second) + y,
1853 HashLen16(x + w.second, y + v.second));
1854 }
1855
1856 STATIC_INLINE uint128_t CityHash128(const char *s, size_t len) {
1857 return len >= 16 ?
1858 CityHash128WithSeed(s + 16, len - 16,
1859 uint128_t(Fetch(s), Fetch(s + 8) + k0)) :
1860 CityHash128WithSeed(s, len, uint128_t(k0, k1));
1861 }
1862
1863 uint128_t Fingerprint128(const char* s, size_t len) {
1864 return CityHash128(s, len);
1865 }
1866 } // namespace farmhashcc
1867 namespace NAMESPACE_FOR_HASH_FUNCTIONS {
1868
1869 // BASIC STRING HASHING
1870
1871 // Hash function for a byte array. See also Hash(), below.
1872 // May change from time to time, may differ on different platforms, may differ
1873 // depending on NDEBUG.
1874 uint32_t Hash32(const char* s, size_t len) {
1875 return DebugTweak(
1876 (can_use_sse41 & x86_64) ? farmhashnt::Hash32(s, len) :
1877 (can_use_sse42 & can_use_aesni) ? farmhashsu::Hash32(s, len) :
1878 can_use_sse42 ? farmhashsa::Hash32(s, len) :
1879 farmhashmk::Hash32(s, len));
1880 }
1881
1882 // Hash function for a byte array. For convenience, a 32-bit seed is also
1883 // hashed into the result.
1884 // May change from time to time, may differ on different platforms, may differ
1885 // depending on NDEBUG.
1886 uint32_t Hash32WithSeed(const char* s, size_t len, uint32_t seed) {
1887 return DebugTweak(
1888 (can_use_sse41 & x86_64) ? farmhashnt::Hash32WithSeed(s, len, seed) :
1889 (can_use_sse42 & can_use_aesni) ? farmhashsu::Hash32WithSeed(s, len, seed) :
1890 can_use_sse42 ? farmhashsa::Hash32WithSeed(s, len, seed) :
1891 farmhashmk::Hash32WithSeed(s, len, seed));
1892 }
1893
1894 // Hash function for a byte array. For convenience, a 64-bit seed is also
1895 // hashed into the result. See also Hash(), below.
1896 // May change from time to time, may differ on different platforms, may differ
1897 // depending on NDEBUG.
1898 uint64_t Hash64(const char* s, size_t len) {
1899 return DebugTweak(
1900 (can_use_sse42 & x86_64) ?
1901 farmhashte::Hash64(s, len) :
1902 farmhashxo::Hash64(s, len));
1903 }
1904
1905 // Hash function for a byte array.
1906 // May change from time to time, may differ on different platforms, may differ
1907 // depending on NDEBUG.
1908 size_t Hash(const char* s, size_t len) {
1909 return sizeof(size_t) == 8 ? Hash64(s, len) : Hash32(s, len);
1910 }
1911
1912 // Hash function for a byte array. For convenience, a 64-bit seed is also
1913 // hashed into the result.
1914 // May change from time to time, may differ on different platforms, may differ
1915 // depending on NDEBUG.
1916 uint64_t Hash64WithSeed(const char* s, size_t len, uint64_t seed) {
1917 return DebugTweak(farmhashna::Hash64WithSeed(s, len, seed));
1918 }
1919
1920 // Hash function for a byte array. For convenience, two seeds are also
1921 // hashed into the result.
1922 // May change from time to time, may differ on different platforms, may differ
1923 // depending on NDEBUG.
1924 uint64_t Hash64WithSeeds(const char* s, size_t len, uint64_t seed0, uint64_t see d1) {
1925 return DebugTweak(farmhashna::Hash64WithSeeds(s, len, seed0, seed1));
1926 }
1927
1928 // Hash function for a byte array.
1929 // May change from time to time, may differ on different platforms, may differ
1930 // depending on NDEBUG.
1931 uint128_t Hash128(const char* s, size_t len) {
1932 return DebugTweak(farmhashcc::Fingerprint128(s, len));
1933 }
1934
1935 // Hash function for a byte array. For convenience, a 128-bit seed is also
1936 // hashed into the result.
1937 // May change from time to time, may differ on different platforms, may differ
1938 // depending on NDEBUG.
1939 uint128_t Hash128WithSeed(const char* s, size_t len, uint128_t seed) {
1940 return DebugTweak(farmhashcc::CityHash128WithSeed(s, len, seed));
1941 }
1942
1943 // BASIC NON-STRING HASHING
1944
1945 // FINGERPRINTING (i.e., good, portable, forever-fixed hash functions)
1946
1947 // Fingerprint function for a byte array. Most useful in 32-bit binaries.
1948 uint32_t Fingerprint32(const char* s, size_t len) {
1949 return farmhashmk::Hash32(s, len);
1950 }
1951
1952 // Fingerprint function for a byte array.
1953 uint64_t Fingerprint64(const char* s, size_t len) {
1954 return farmhashna::Hash64(s, len);
1955 }
1956
1957 // Fingerprint function for a byte array.
1958 uint128_t Fingerprint128(const char* s, size_t len) {
1959 return farmhashcc::Fingerprint128(s, len);
1960 }
1961
1962 // Older and still available but perhaps not as fast as the above:
1963 // farmhashns::Hash32{,WithSeed}()
1964
1965 } // namespace NAMESPACE_FOR_HASH_FUNCTIONS
1966
1967 #if FARMHASHSELFTEST
1968
1969 #ifndef FARMHASH_SELF_TEST_GUARD
1970 #define FARMHASH_SELF_TEST_GUARD
1971 #include <cstdio>
1972 #include <iostream>
1973 #include <string.h>
1974
1975 using std::cout;
1976 using std::cerr;
1977 using std::endl;
1978 using std::hex;
1979
1980 static const uint64_t kSeed0 = 1234567;
1981 static const uint64_t kSeed1 = k0;
1982 static const int kDataSize = 1 << 20;
1983 static const int kTestSize = 300;
1984 #define kSeed128 Uint128(kSeed0, kSeed1)
1985
1986 static char data[kDataSize];
1987
1988 static int completed_self_tests = 0;
1989 static int errors = 0;
1990
1991 // Initialize data to pseudorandom values.
1992 void Setup() {
1993 if (completed_self_tests == 0) {
1994 uint64_t a = 9;
1995 uint64_t b = 777;
1996 for (int i = 0; i < kDataSize; i++) {
1997 a += b;
1998 b += a;
1999 a = (a ^ (a >> 41)) * k0;
2000 b = (b ^ (b >> 41)) * k0 + i;
2001 uint8_t u = b >> 37;
2002 memcpy(data + i, &u, 1); // uint8_t -> char
2003 }
2004 }
2005 }
2006
2007 int NoteErrors() {
2008 #define NUM_SELF_TESTS 9
2009 if (++completed_self_tests == NUM_SELF_TESTS)
2010 std::exit(errors > 0);
2011 return errors;
2012 }
2013
2014 template <typename T> inline bool IsNonZero(T x) {
2015 return x != 0;
2016 }
2017
2018 template <> inline bool IsNonZero<uint128_t>(uint128_t x) {
2019 return x != Uint128(0, 0);
2020 }
2021
2022 #endif // FARMHASH_SELF_TEST_GUARD
2023
2024 namespace farmhashccTest {
2025
2026 uint32_t CreateSeed(int offset, int salt) {
2027 uint32_t h = static_cast<uint32_t>(salt & 0xffffffff);
2028 h = h * c1;
2029 h ^= (h >> 17);
2030 h = h * c1;
2031 h ^= (h >> 17);
2032 h = h * c1;
2033 h ^= (h >> 17);
2034 h += static_cast<uint32_t>(offset & 0xffffffff);
2035 h = h * c1;
2036 h ^= (h >> 17);
2037 h = h * c1;
2038 h ^= (h >> 17);
2039 h = h * c1;
2040 h ^= (h >> 17);
2041 return h;
2042 }
2043
2044 #undef SEED
2045 #undef SEED1
2046 #undef SEED0
2047 #define SEED CreateSeed(offset, -1)
2048 #define SEED0 CreateSeed(offset, 0)
2049 #define SEED1 CreateSeed(offset, 1)
2050
2051 #undef TESTING
2052 #define TESTING 1
2053 #if TESTING
2054 uint32_t expected[] = {
2055 4223616069u,
2056 3696677242u,
2057 1039179260u, 1690343979u, 1018511555u, 2464489001u,
2058 20368522u, 2663783964u, 175201532u, 1619210592u,
2059 4081014168u,
2060 2576519988u,
2061 3285042206u, 502478099u, 739479538u, 1500332790u,
2062 13754768u, 3789353455u, 3473868058u, 1909255088u,
2063 2212771159u,
2064 1112731063u,
2065 826915357u, 2893489933u, 118369799u, 1848668220u,
2066 1308219822u, 249416982u, 64306364u, 4221800195u,
2067 1020067935u,
2068 3955445564u,
2069 563346294u, 550236731u, 2339016688u, 1826259714u,
2070 3872358639u, 2295981050u, 1870005390u, 4015628802u,
2071 1451961420u,
2072 653440099u,
2073 1292493871u, 164377749u, 1717712483u, 463414587u,
2074 3924343675u, 1050492084u, 3566618804u, 2046983362u,
2075 31917516u,
2076 2957164615u,
2077 230718965u, 999595115u, 3534822176u, 2175709186u,
2078 965707431u, 441796222u, 2481718051u, 1827777486u,
2079 2590087362u,
2080 3879448744u,
2081 3515079898u, 1601433082u, 982764532u, 254808716u,
2082 1293372530u, 4205605817u, 947001462u, 1138890052u,
2083 176305566u,
2084 2447367541u,
2085 2973802542u, 4123621138u, 3083865840u, 1706367795u,
2086 792114347u, 2880110657u, 440613768u, 195054868u,
2087 1359016305u,
2088 3363804638u,
2089 649488537u, 1624045597u, 1441938215u, 3147758996u,
2090 3199173578u, 2597283203u, 2191333609u, 3763129144u,
2091 1117290165u,
2092 1062549743u,
2093 2565615889u, 1046361554u, 1581968261u, 1058773671u,
2094 1123053168u, 3807622275u, 1486749916u, 3900816089u,
2095 2437877004u,
2096 1894455839u,
2097 1912520953u, 1914997013u, 561048608u, 1643267444u,
2098 3671572006u, 194811086u, 1468911468u, 2179206286u,
2099 673206794u,
2100 3486923651u,
2101 3741426466u, 3292160512u, 697001377u, 1900763774u,
2102 3726097344u, 629282039u, 3578723715u, 2868028489u,
2103 3269862919u,
2104 2303349487u,
2105 3643953525u, 2307255916u, 849996280u, 732080434u,
2106 909961480u, 3542445214u, 2628347095u, 4236856917u,
2107 1380660650u,
2108 2631821908u,
2109 2007289004u, 3509705198u, 3788541675u, 789457322u,
2110 3090670546u, 638977894u, 3503881773u, 947102987u,
2111 1525325287u,
2112 1816697045u,
2113 2706647405u, 288763142u, 3505438495u, 481308609u,
2114 2882636782u, 3745162621u, 3503467033u, 428247823u,
2115 176408838u,
2116 333551502u,
2117 1001068721u, 1681483651u, 75380831u, 4191469679u,
2118 3627361839u, 2736617386u, 3120737438u, 1297502456u,
2119 864896482u,
2120 85674920u,
2121 2886047255u, 4119881331u, 2496990525u, 3442502055u,
2122 1806582817u, 3186345024u, 4099591287u, 2560171465u,
2123 3489229104u,
2124 3065015872u,
2125 2755089808u, 3098442882u, 378524719u, 2664097023u,
2126 1771960725u, 2901182183u, 55258521u, 1266621443u,
2127 581644891u,
2128 37790450u,
2129 1800731704u, 3601350920u, 53428754u, 2759476837u,
2130 3391093099u, 1496510311u, 2511119507u, 2636877410u,
2131 631613207u,
2132 1573846064u,
2133 260484875u, 1088212603u, 2369525206u, 322522428u,
2134 3191396600u, 2076543340u, 1552496658u, 2739811558u,
2135 3867875546u,
2136 2051584261u,
2137 2126250818u, 901517871u, 3651631165u, 1323139145u,
2138 1521111765u, 477802997u, 3508559783u, 383954241u,
2139 3804516756u,
2140 4250206331u,
2141 2655954340u, 2484996477u, 1417544845u, 1520282298u,
2142 2745204366u, 2869345147u, 1872738335u, 2592877343u,
2143 1619744564u,
2144 1804962124u,
2145 3458679890u, 423948620u, 273645618u, 4187865426u,
2146 376057175u, 2943431463u, 3581950599u, 1035398331u,
2147 1088213445u,
2148 861988903u,
2149 1323370244u, 777069428u, 506235917u, 369720851u,
2150 2789995854u, 230915180u, 1505086948u, 940361236u,
2151 3727873235u,
2152 1159167499u,
2153 1860302871u, 3456858862u, 3923555152u, 2131072714u,
2154 2910461068u, 3671950363u, 2010742682u, 4088068851u,
2155 3616470388u,
2156 2087714788u,
2157 221675509u, 1230154072u, 3450704646u, 1463226695u,
2158 1998357699u, 266026801u, 619568740u, 3560427266u,
2159 4148162586u,
2160 3150417316u,
2161 1356375822u, 2056097622u, 627905802u, 3881675638u,
2162 2309738053u, 971916703u, 3447805361u, 1673575328u,
2163 673084328u,
2164 3317849401u,
2165 2836362782u, 2377208890u, 3275350588u, 158350552u,
2166 2553241779u, 2497264995u, 3262882649u, 3897937187u,
2167 1598963653u,
2168 3068514414u,
2169 601541505u, 374517071u, 3380795976u, 235752573u,
2170 284670003u, 2990192160u, 904937105u, 2306579150u,
2171 2117362589u,
2172 1635274830u,
2173 3355572906u, 170799903u, 1226685528u, 664567688u,
2174 413219134u, 878324258u, 4026159448u, 3620649295u,
2175 1823625377u,
2176 3175888439u,
2177 1759344347u, 2640637095u, 3549558u, 2192984935u,
2178 978623493u, 804017880u, 3877562323u, 3843116489u,
2179 1641748342u,
2180 1853539444u,
2181 3001178468u, 3443560727u, 2685426077u, 1653064722u,
2182 349231508u, 2726789654u, 3136215581u, 768402830u,
2183 269384321u,
2184 531936536u,
2185 2592883487u, 1343156334u, 3628619802u, 1477143570u,
2186 4269458419u, 3285611028u, 959104925u, 2712290710u,
2187 3480237248u,
2188 835796333u,
2189 2020636251u, 1191914589u, 126521603u, 4288023938u,
2190 3731699932u, 2136758855u, 985780142u, 193807575u,
2191 1850544433u,
2192 653947619u,
2193 3929316796u, 381871169u, 950486363u, 1787262279u,
2194 360480382u, 1800636585u, 1039258631u, 3682073259u,
2195 1262819303u,
2196 1786000319u,
2197 1570627191u, 893065837u, 301304916u, 1478469809u,
2198 623018819u, 2742232545u, 2058913014u, 1706060059u,
2199 2421125401u,
2200 1315829592u,
2201 3208766775u, 1805586156u, 575853086u, 3085025513u,
2202 4010908260u, 2344058256u, 3814407434u, 1458485673u,
2203 2474514786u,
2204 3581895658u,
2205 2710719679u, 190812706u, 2135454262u, 2620080728u,
2206 3400757986u, 1669914857u, 1559978393u, 1629811331u,
2207 3096616493u,
2208 1391424435u,
2209 4158376003u, 1015657076u, 794783832u, 479952178u,
2210 1150290207u, 2497437906u, 231815090u, 755078067u,
2211 3832053281u,
2212 63649475u,
2213 2415822606u, 4105027719u, 1706992318u, 1106598740u,
2214 3941945667u, 1271300761u, 505882259u, 760186809u,
2215 2657183368u,
2216 1925422058u,
2217 1039773764u, 880219458u, 4275949176u, 1556833823u,
2218 925882132u, 4216310340u, 757497522u, 461833914u,
2219 3884002070u,
2220 2790957660u,
2221 2100050089u, 651959176u, 1380301291u, 1289124125u,
2222 452314403u, 226156280u, 3306924715u, 1750807758u,
2223 2290180542u,
2224 1953760569u,
2225 2253069096u, 3960924806u, 1786291620u, 60736185u,
2226 2569018293u, 3870479674u, 2247005661u, 2239850953u,
2227 4261808536u,
2228 3282975782u,
2229 780945879u, 3349849383u, 1579362556u, 2265045884u,
2230 905088740u, 725212379u, 3156479246u, 2501620391u,
2231 3062836263u,
2232 4070422690u,
2233 996797869u, 4082582315u, 976105756u, 303983602u,
2234 1862104804u, 3864508254u, 3383979677u, 2835500286u,
2235 2798364010u,
2236 519359476u,
2237 3447342725u, 194373889u, 3313466630u, 232399983u,
2238 2841787856u, 1672751454u, 3345183154u, 1805381384u,
2239 2226129336u,
2240 2847829057u,
2241 2350774567u, 2838540121u, 2757948482u, 1017002062u,
2242 2329150951u, 2171488196u, 3668619047u, 3874977844u,
2243 3287966998u,
2244 262346753u,
2245 2493054715u, 2298644430u, 2926101182u, 1528457638u,
2246 598656233u, 2615845874u, 989110727u, 820441411u,
2247 253617372u,
2248 2201077208u,
2249 2047569338u, 3114356329u, 3335563734u, 2967673540u,
2250 768438341u, 1417708203u, 3873718246u, 1538441843u,
2251 1279167650u,
2252 3917966776u,
2253 2218481734u, 1015935150u, 1957845042u, 1318150213u,
2254 3146423971u, 4218994877u, 1162470863u, 1519718292u,
2255 2594658906u,
2256 665870414u,
2257 3430347817u, 3933868731u, 1597041394u, 3138684682u,
2258 3398212027u, 1064647658u, 1576321132u, 14792918u,
2259 224938029u,
2260 3706456050u,
2261 847274786u, 2645698692u, 1743374687u, 2343133224u,
2262 3066596790u, 2857270120u, 200596308u, 452055528u,
2263 2319312082u,
2264 3488655402u,
2265 4146865894u, 608206438u, 2699777051u, 3687240713u,
2266 327957508u, 3664730153u, 568134564u, 2993484554u,
2267 4159860363u,
2268 4274533921u,
2269 1079994063u, 2360220210u, 3609597760u, 3639708902u,
2270 2836180437u, 1069910270u, 1892427666u, 1874729790u,
2271 1267712826u,
2272 121886940u,
2273 3572289214u, 2475945610u, 783779452u, 588827737u,
2274 1531395014u, 2085084212u, 2219189792u, 3981444548u,
2275 2218885336u,
2276 1691622694u,
2277 2053232885u, 1386558530u, 2182946189u, 2365247285u,
2278 1871081313u, 2935751853u, 38413723u, 543465863u,
2279 900691890u,
2280 2899905665u,
2281 575120562u, 93133904u, 457154948u, 2983705792u,
2282 4232229200u, 2038565963u, 614693984u, 3405328302u,
2283 4083090010u,
2284 2088004171u,
2285 244031209u, 1861889294u, 2417109253u, 3299562328u,
2286 4158642443u, 4199064449u, 3161611046u, 885015950u,
2287 3677904099u,
2288 2969861785u,
2289 772348805u, 1712263832u, 3219357614u, 484271305u,
2290 3645706114u, 2059620251u, 409557488u, 2278896731u,
2291 224475749u,
2292 3523022952u,
2293 2057140088u, 449131785u, 1149879244u, 4255363996u,
2294 3602720135u, 1690010854u, 2503998822u, 2750828466u,
2295 3340671802u,
2296 1447583863u,
2297 2649684943u, 2764747249u, 3046070595u, 3441726138u,
2298 3840332559u, 3156747501u, 1288666680u, 1472744459u,
2299 3452391933u,
2300 1617542784u,
2301 217869690u, 3718469527u, 348639731u, 590532355u,
2302 43789787u, 22606314u, 1621559290u, 2231743261u,
2303 2234620879u,
2304 544748955u,
2305 3169387920u, 203343594u, 3272552527u, 1078282365u,
2306 809576321u, 854207584u, 3625491053u, 1193737267u,
2307 1628966807u,
2308 2661421060u,
2309 2433442061u, 3886639039u, 2149304418u, 303000565u,
2310 1432830882u, 137378235u, 1135974068u, 318705754u,
2311 2491227157u,
2312 2627534472u,
2313 3520352233u, 2488397682u, 3969194920u, 3843962181u,
2314 2135981459u, 2611933220u, 799460731u, 2300968851u,
2315 3412851628u,
2316 3070914013u,
2317 3555224260u, 4125937572u, 240359903u, 722496673u,
2318 2061023600u, 3843919221u, 2759960043u, 1191155322u,
2319 1504041490u,
2320 3735253656u,
2321 1773124736u, 101110011u, 1627699578u, 2645634551u,
2322 263603947u, 1388368439u, 677146538u, 1644201982u,
2323 2625699644u,
2324 2403862553u,
2325 2426069017u, 3613511705u, 915141802u, 2981654265u,
2326 3474818167u, 2611101773u, 627891434u, 762754924u,
2327 2143021902u,
2328 51067670u,
2329 4017746573u, 2269879853u, 3037857950u, 2388899692u,
2330 582729171u, 1886116725u, 2281219772u, 264704948u,
2331 3509984037u,
2332 4078683368u,
2333 2172959411u, 1807195632u, 3357092302u, 2253764928u,
2334 2320369390u, 3076335959u, 2623583210u, 168378015u,
2335 1435562650u,
2336 1100977467u,
2337 3160490319u, 2550328495u, 2396855930u, 1347823908u,
2338 1617990918u, 3849653099u, 3224111576u, 1681539821u,
2339 4171542880u,
2340 552200045u,
2341 3562947778u, 1676237880u, 3747732307u, 2453332913u,
2342 865530667u, 3566636849u, 3485502777u, 336779723u,
2343 2535942410u,
2344 1685000184u,
2345 820545711u, 1893670486u, 1273910461u, 1193758569u,
2346 970365241u, 381205962u, 3612810852u, 1160577445u,
2347 541488143u,
2348 4005031080u,
2349 2333965236u, 2419855455u, 3484533538u, 3073937876u,
2350 908466956u, 661391539u, 2342122412u, 1467049112u,
2351 1785800827u,
2352 135343033u,
2353 139643209u, 2438375667u, 974654058u, 3216478230u,
2354 3807620420u, 779043363u, 2812846449u, 333254784u,
2355 1025244024u,
2356 2242303095u,
2357 2476683742u, 350018683u, 174652916u, 933097576u,
2358 826905896u, 559603581u, 2777181260u, 164915169u,
2359 4070353203u,
2360 1459055748u,
2361 297303985u, 3103837241u, 3812514233u, 232265137u,
2362 2032819099u, 1523091376u, 3531238208u, 1403510182u,
2363 2886832080u,
2364 2599705941u,
2365 2789695716u, 68437968u, 3823813791u, 1040994569u,
2366 3024194990u, 2461740520u, 3735391266u, 2042207153u,
2367 2461678616u,
2368 3519231840u,
2369 1344224923u, 411442756u, 1179779351u, 7661528u,
2370 778352196u, 3288808867u, 589356197u, 2627504511u,
2371 3374744599u,
2372 3312172905u,
2373 357423007u, 3539567796u, 4044452215u, 1445118403u,
2374 2937983820u, 184089910u, 346201845u, 2427295202u,
2375 1345448010u,
2376 2884434843u,
2377 3085001879u, 2640105409u, 315310640u, 3530289798u,
2378 3362974764u, 963602652u, 75228477u, 3509381180u,
2379 4012777756u,
2380 2380345941u,
2381 1073137836u, 2083960378u, 1220315185u, 3628720934u,
2382 3508867818u, 67148343u, 3558085158u, 1753943368u,
2383 863309561u,
2384 2844713625u,
2385 441921850u, 854732254u, 816793316u, 2555428747u,
2386 3440623414u, 1707304366u, 3189874375u, 1623229221u,
2387 1220335976u,
2388 806745430u,
2389 3909262947u, 1680369031u, 2926179486u, 3410391660u,
2390 3991630434u, 2876458763u, 1179167079u, 536360759u,
2391 1592117159u,
2392 1514343977u,
2393 1032622306u, 2057494855u, 784938958u, 178402996u,
2394 1152907972u, 2326185495u, 2939973666u, 4181120253u,
2395 552831733u,
2396 664251856u,
2397 1297139539u, 1969357631u, 1474065957u, 3055419017u,
2398 3395829380u, 3316562752u, 2168409017u, 614624786u,
2399 3585854336u,
2400 668291094u,
2401 1162889217u, 3773171307u, 2263271126u, 355089668u,
2402 3195850578u, 3396793277u, 3519870267u, 527857605u,
2403 3972392320u,
2404 2224315010u,
2405 4047225561u, 3271434798u, 3192704713u, 2798505213u,
2406 3932215896u, 3792924012u, 3796843756u, 453872975u,
2407 4050552799u,
2408 1056432676u,
2409 928166947u, 121311642u, 930989547u, 2087070683u,
2410 1288978057u, 1556325239u, 1812435626u, 1682385724u,
2411 1214364933u,
2412 904760776u,
2413 3957045528u, 3949822847u, 2411065880u, 3716420732u,
2414 3424837835u, 3833550693u, 1799375326u, 2012368921u,
2415 2768764136u,
2416 1786111037u,
2417 4055479315u, 3751639533u, 2808224623u, 3492656387u,
2418 1306824780u, 2624000170u, 3134795218u, 1778409297u,
2419 3900821801u,
2420 593336325u,
2421 2772069220u, 2980873673u, 3574497158u, 3994780459u,
2422 4246519854u, 3482758570u, 4228015183u, 33101083u,
2423 1769887734u,
2424 4158035314u,
2425 3690638998u, 1119035482u, 4134969651u, 2483207353u,
2426 3932823321u, 285829887u, 3485140138u, 1304815138u,
2427 995608264u,
2428 3133997465u,
2429 1195477617u, 2147693728u, 3506673112u, 4234467492u,
2430 1183174337u, 1395340482u, 769199343u, 193262308u,
2431 2798920256u,
2432 3827889422u,
2433 3399695609u, 3036045724u, 2999477386u, 3567001759u,
2434 2682864314u, 1414023907u, 3699872975u, 3369870701u,
2435 2662284872u,
2436 2179640019u,
2437 2485080099u, 3234415609u, 3755915606u, 1339453220u,
2438 1567403399u, 2076272391u, 293946298u, 3861962750u,
2439 1291949822u,
2440 2916864995u,
2441 132642326u, 2215117062u, 2205863575u, 2488805750u,
2442 405632860u, 3248129390u, 2952606864u, 896734759u,
2443 2047417173u,
2444 3865951392u,
2445 657296855u, 1328547532u, 3966511825u, 3959682388u,
2446 4171801020u, 2981416957u, 1868896247u, 790081075u,
2447 3143666398u,
2448 2950766549u,
2449 2065854887u, 2737081890u, 995061774u, 1510712611u,
2450 2865954809u, 565044286u, 1565631102u, 1500654931u,
2451 494822108u,
2452 2803515503u,
2453 1058154996u, 3506280187u, 856885925u, 4204610546u,
2454 800905649u, 1130711562u, 558146282u, 2053400666u,
2455 449794061u,
2456 2643520245u,
2457 2101248725u, 3123292429u, 3583524041u, 983372394u,
2458 1587743780u, 672870813u, 444833475u, 100741452u,
2459 366232251u,
2460 1717951248u,
2461 524144122u, 1362432726u, 1304947719u, 674306020u,
2462 405665887u, 4081931036u, 1580408204u, 2343242778u,
2463 3901654006u,
2464 2627173567u,
2465 3015148205u, 814686701u, 1327920712u, 1346494176u,
2466 2468632605u, 2259795544u, 2519278184u, 2129281928u,
2467 2860266380u,
2468 4001619412u,
2469 1154910973u, 2841022216u, 1199925485u, 1372200293u,
2470 2713179055u, 3609776550u, 2896463880u, 1056406892u,
2471 177413841u,
2472 40180172u,
2473 3274788406u, 660921784u, 1686225028u, 4003382965u,
2474 2532691887u, 4256809101u, 1186018983u, 667359096u,
2475 2375266493u,
2476 2760222015u,
2477 745187078u, 312264012u, 396822261u, 2588536966u,
2478 2026998998u, 1766454365u, 3218807676u, 3915487497u,
2479 2630550356u,
2480 4130063378u,
2481 4231937074u, 752212123u, 3085144349u, 3267186363u,
2482 4103872100u, 4193207863u, 1306401710u, 3014853131u,
2483 1067760598u,
2484 2306188342u,
2485 2437881506u, 4258185052u, 2506507580u, 130876929u,
2486 1076894205u, 4106981702u, 2799540844u, 945747327u,
2487 1436722291u,
2488 2499772225u,
2489 2571537041u, 2038830635u, 2066826058u, 2892892912u,
2490 524875858u, 3392572161u, 2869992096u, 1308273341u,
2491 923668994u,
2492 1980407857u,
2493 2275009652u, 240598096u, 2658376530u, 3505603048u,
2494 1022603789u, 582423424u, 846379327u, 4092636095u,
2495 4177298326u,
2496 1004173023u,
2497 2154027018u, 2993634669u, 1098364089u, 3035642175u,
2498 1335688126u, 1376393415u, 1252369770u, 3815033328u,
2499 1999309358u,
2500 1234054757u,
2501 1388595255u, 2859334775u, 366532860u, 3453410395u,
2502 4226967708u, 1321729870u, 2078463405u, 156766592u,
2503 3157683394u,
2504 3549293384u,
2505 3348214547u, 2879648344u, 1144813399u, 2758966254u,
2506 647753581u, 813615926u, 2035441590u, 1961053117u,
2507 600168686u,
2508 2192833387u,
2509 3156481401u, 3627320321u, 383550248u, 81209584u,
2510 2339331745u, 1284116690u, 1980144976u, 2955724163u,
2511 789301728u,
2512 3842040415u,
2513 1115881490u, 965249078u, 4098663322u, 1870257033u,
2514 2923150701u, 4217108433u, 183816559u, 2104089285u,
2515 2640095343u,
2516 3173757052u,
2517 927847464u, 2383114981u, 4287174363u, 1886129652u,
2518 70635161u, 1182924521u, 1121440038u, 4246220730u,
2519 3890583049u,
2520 975913757u,
2521 2436253031u, 1074894869u, 1301280627u, 992471939u,
2522 735658128u, 244441856u, 1541612456u, 3457776165u,
2523 3503534059u,
2524 1931651133u,
2525 349142786u, 3669028584u, 1828812038u, 99128389u,
2526 1364272849u, 1963678455u, 3971963311u, 2316950886u,
2527 1308901796u,
2528 2789591580u,
2529 1460494965u, 2380227479u, 1577190651u, 1755822080u,
2530 2911014607u, 859387544u, 13023113u, 2319243370u,
2531 2522582211u,
2532 2299110490u,
2533 3342378874u, 2589323490u, 1884430765u, 3739058655u,
2534 2419330954u, 355389916u, 273950915u, 3670136553u,
2535 410946824u,
2536 3174041420u,
2537 2609010298u, 3059091350u, 2300275014u, 725729828u,
2538 2548380995u, 1738849964u, 1257081412u, 79430455u,
2539 810321297u,
2540 3246190593u,
2541 1007937684u, 912115394u, 40880059u, 3450073327u,
2542 4289832174u, 2253485111u, 1065639151u, 2953189309u,
2543 124779113u,
2544 654299738u,
2545 115760833u, 1250932069u, 884995826u, 3998908281u,
2546 1382882981u, 1134187162u, 3202324501u, 487502928u,
2547 3032756345u,
2548 4057517628u,
2549 933197381u, 2319223127u, 2044528655u, 2554572663u,
2550 4049450620u, 1620812836u, 2832905391u, 2273005481u,
2551 1913090121u,
2552 1055456023u,
2553 510593296u, 3285343192u, 2912822536u, 1645225063u,
2554 638418430u, 452701300u, 1025483165u, 1639370512u,
2555 167948643u,
2556 2809842730u,
2557 2983135664u, 407521332u, 1543756616u, 3949773145u,
2558 4283462892u, 659962275u, 3878013463u, 1000748756u,
2559 4053212051u,
2560 4099239406u,
2561 3467581965u, 354635541u, 21301844u, 3831212473u,
2562 3189450571u, 2264401966u, 4096484849u, 1736448515u,
2563 3976926096u,
2564 3727194724u,
2565 2243487039u, 585209095u, 3143046007u, 969558123u,
2566 3037113502u, 3594170243u, 2835860223u, 3775493975u,
2567 2787220812u,
2568 2274252217u,
2569 2915380701u, 3077533278u, 1252871826u, 1519790952u,
2570 205297661u, 2950557658u, 3956882191u, 2724439401u,
2571 3694608025u,
2572 124028038u,
2573 216019153u, 1533010676u, 2259986336u, 2014061617u,
2574 2068617849u, 3078123052u, 2692046098u, 1582812948u,
2575 396916232u,
2576 1470894001u,
2577 1694309312u, 300268215u, 1553892743u, 671176040u,
2578 1544988994u, 2793402821u, 4194972569u, 2296476154u,
2579 748354332u,
2580 3491325898u,
2581 4261053291u, 1104998242u, 797816835u, 243564059u,
2582 2197717393u, 299029458u, 1675252188u, 3139770041u,
2583 583018574u,
2584 2532106100u,
2585 2099391658u, 3760526730u, 3422719327u, 3556917689u,
2586 2374009285u, 2130865894u, 3710563151u, 1437538307u,
2587 3938030842u,
2588 2006930694u,
2589 2151243336u, 1939741287u, 1957068175u, 2135147479u,
2590 649553342u, 1713643042u, 4188696599u, 1698739939u,
2591 3549427584u,
2592 1016382174u,
2593 322644378u, 2476164549u, 2037263020u, 88036019u,
2594 2548960923u, 539867919u, 2871157727u, 4031659929u,
2595 754087252u,
2596 972656559u,
2597 4246379429u, 3877308578u, 2059459630u, 3614934323u,
2598 1410565271u, 2102980459u, 215395636u, 1083393481u,
2599 3775523015u,
2600 2062750105u,
2601 2475645882u, 3041186774u, 3534315423u, 758607219u,
2602 1686100614u, 180500983u, 1155581185u, 1476664671u,
2603 2918661695u,
2604 3812731350u,
2605 4003853737u, 4148884881u, 1468469436u, 3278880418u,
2606 1045838071u, 1049161262u, 360450415u, 3158065524u,
2607 814443735u,
2608 3391401707u,
2609 729968410u, 738771593u, 3662738792u, 1672830580u,
2610 4199496163u, 188487238u, 219098233u, 2141731267u,
2611 3890250614u,
2612 2988780375u,
2613 4026279523u, 3489429375u, 2468433807u, 1178270701u,
2614 2685094218u, 2716621497u, 3718335529u, 2273344755u,
2615 701110882u,
2616 1925717409u,
2617 1515176562u, 2325460593u, 3954798930u, 784566105u,
2618 3769422266u, 1641530321u, 2703876862u, 2907480267u,
2619 1828076455u,
2620 1805635221u,
2621 3883381245u, 1476756210u, 2072514392u, 3658557081u,
2622 2003610746u, 2556845550u, 729594004u, 3303898266u,
2623 1968227254u,
2624 423204951u,
2625 231828688u, 4223697811u, 698619045u, 3636824418u,
2626 2738779239u, 2333529003u, 2833158642u, 580285428u,
2627 3038148234u,
2628 1012378004u,
2629 1113647298u, 1424593483u, 4053247723u, 1167152941u,
2630 2677383578u, 3419485379u, 2135673840u, 440478166u,
2631 1682229112u,
2632 3226724137u,
2633 1217439806u, 3828726923u, 3636576271u, 3467643156u,
2634 2005614908u, 2655346461u, 2345488441u, 1027557096u,
2635 3594084220u,
2636 1372306343u,
2637 2342583762u, 4291342905u, 4094931814u, 3254771759u,
2638 821978248u, 2404930117u, 1143937655u, 3156949255u,
2639 3460606610u,
2640 449701786u,
2641 3474906110u, 1932585294u, 2283357584u, 1808481478u,
2642 3522851029u, 3040164731u, 1530172182u, 2950426149u,
2643 1402416557u,
2644 756419859u,
2645 4132576145u, 724994790u, 2852015871u, 2177908339u,
2646 899914731u, 139675671u, 1423281870u, 3198458070u,
2647 807581308u,
2648 2021611521u,
2649 1801452575u, 1425984297u, 2833835949u, 1536827865u,
2650 3902351840u, 164546042u, 1872840974u, 3986194780u,
2651 792156290u,
2652 3378681896u,
2653 941547959u, 3931328334u, 3661060482u, 2386420777u,
2654 3920146272u, 3458621279u, 3348500844u, 2269586542u,
2655 797371473u,
2656 3188953649u,
2657 80514771u, 2913333490u, 1246325623u, 3253846094u,
2658 1723906239u, 1606413555u, 587500718u, 1412413859u,
2659 2310046829u,
2660 2113313263u,
2661 3855635608u, 47271944u, 1112281934u, 3440228404u,
2662 2633519166u, 425094457u, 307659635u, 67338587u,
2663 2412987939u,
2664 2363930989u,
2665 2853008596u, 2844637339u, 922568813u, 130379293u,
2666 2825204405u, 2904442145u, 1176875333u, 1511685505u,
2667 599177514u,
2668 1872681372u,
2669 682394826u, 1888849790u, 3635304282u, 1761257265u,
2670 1571292431u, 355247075u, 1177210823u, 1691529530u,
2671 3629531121u,
2672 3760474006u,
2673 1129340625u, 868116266u, 3908237785u, 1942124366u,
2674 1266630014u, 3214841995u, 334023850u, 1110037019u,
2675 369650727u,
2676 1288666741u,
2677 70535706u, 20230114u, 4284225520u, 727856157u,
2678 293696779u, 1244943770u, 3976592462u, 560421917u,
2679 4171688499u,
2680 2438786950u,
2681 1218144639u, 3809125983u, 1302395746u, 534542359u,
2682 2121993015u, 2899519374u, 3192177626u, 1761707794u,
2683 3101683464u,
2684 1555403906u,
2685 3225675390u, 1875263768u, 4278894569u, 651707603u,
2686 2111591484u, 3802716028u, 2900262228u, 1181469202u,
2687 3254743797u,
2688 1822684466u,
2689 860641829u, 3046128268u, 1284833012u, 1125261608u,
2690 461384524u, 2331344566u, 1274400010u, 990498321u,
2691 3462536298u,
2692 3796842585u,
2693 2346607194u, 279495949u, 3951194590u, 3522664971u,
2694 3169688303u, 726831706u, 1123875117u, 1816166599u,
2695 3759808754u,
2696 2918558151u,
2697 3713203220u, 3369939267u, 466047109u, 384042536u,
2698 587271104u, 2191634696u, 2449929095u, 1157932232u,
2699 2084466674u,
2700 841370485u,
2701 3241372562u, 4277738486u, 2150836793u, 1173569449u,
2702 778768930u, 2594706485u, 3065269405u, 3019263663u,
2703 2660146610u,
2704 2789946230u,
2705 77056913u, 728174395u, 3647185904u, 804562358u,
2706 2697276483u, 881311175u, 1178696435u, 2059173891u,
2707 2308303791u,
2708 221481230u,
2709 50241451u, 3689414100u, 1969074761u, 2732071529u,
2710 1900890356u, 840789500u, 2100609300u, 985565597u,
2711 1220850414u,
2712 2456636259u,
2713 223607678u, 1016310244u, 1937434395u, 85717256u,
2714 275058190u, 3712011133u, 171916016u, 2389569096u,
2715 3679765802u,
2716 3575358777u,
2717 3481108261u, 3178286380u, 2489642395u, 2931039055u,
2718 3086601621u, 3079518902u, 3027718495u, 2506894644u,
2719 2976869602u,
2720 2134336365u,
2721 2420172217u, 918054427u, 661522682u, 1403791357u,
2722 3587174388u, 2623673551u, 1355661457u, 4159477684u,
2723 1109013587u,
2724 3112183488u,
2725 2217849279u, 3500291996u, 2419603731u, 2929886201u,
2726 3854470013u, 1358382103u, 1357666555u, 21053566u,
2727 2716621233u,
2728 3094836862u,
2729 3309729704u, 57086558u, 839187419u, 2757944838u,
2730 3651040558u, 3607536716u, 3691257732u, 2312878285u,
2731 1202511724u,
2732 183479927u,
2733 2509829803u, 109313218u, 478173887u, 2072044014u,
2734 190631406u, 2495604975u, 1010416260u, 3679857586u,
2735 726566957u,
2736 258500881u,
2737 1805873908u, 3081447051u, 2352101327u, 534922207u,
2738 1584552873u, 813470716u, 255914637u, 249169434u,
2739 3193498057u,
2740 1038802706u,
2741 2590158653u, 3147907290u, 663060128u, 1156177857u,
2742 634616100u, 312879189u, 1545020368u, 2054634247u,
2743 3271451914u,
2744 3438291534u,
2745 2181454946u, 3864535432u, 2398586877u, 896491075u,
2746 2810631478u, 2770357487u, 3372930052u, 898070638u,
2747 2051007323u,
2748 392959778u,
2749 36645539u, 3743556044u, 4134529680u, 4124451188u,
2750 566806297u, 2936523982u, 1304761965u, 537399498u,
2751 1940818842u,
2752 40862381u,
2753 36288410u, 3063605629u, 2826611650u, 3961972098u,
2754 1871578006u, 2392095486u, 1136931591u, 513864488u,
2755 173276451u,
2756 3039055682u,
2757 3543322032u, 1943592006u, 657217094u, 1751698246u,
2758 2969618445u, 456616022u, 900309519u, 113892716u,
2759 1126392103u,
2760 1235651045u,
2761 1882073852u, 2136610853u, 2353639710u, 2819956700u,
2762 3980083530u, 828773559u, 224069850u, 902434120u,
2763 2802008036u,
2764 94358995u,
2765 2777723394u, 2812641403u, 2525832595u, 4157388110u,
2766 4235563782u, 937800324u, 141690749u, 568062536u,
2767 550123849u,
2768 1330316521u,
2769 1949488696u, 2296431366u, 1958465262u, 3564751729u,
2770 3748252207u, 120455129u, 1607318832u, 2525729790u,
2771 2640987481u,
2772 2332096657u,
2773 1775969159u, 1555085077u, 2913525137u, 1347085183u,
2774 2376253113u, 3194050574u, 1806090610u, 678641356u,
2775 1499146713u,
2776 383849715u,
2777 3299835823u, 2284860330u, 2614269636u, 3913628844u,
2778 2761334210u, 1959484587u, 529797021u, 239966995u,
2779 3102194829u,
2780 3602307804u,
2781 1122192627u, 3577510006u, 164486066u, 1680137310u,
2782 1473396395u, 1467801424u, 903493660u, 1185943071u,
2783 2798556505u,
2784 2306744492u,
2785 3167201310u, 3577947177u, 3067592134u, 2905506289u,
2786 1210366329u, 204484056u, 2347778932u, 3862374472u,
2787 3277439508u,
2788 4187414621u,
2789 1646699310u, 621385800u, 3934869089u, 3975491588u,
2790 3580085916u, 1925674500u, 2436305348u, 3983301539u,
2791 2739439523u,
2792 3291507446u,
2793 3395637920u, 3753389171u, 2955202032u, 2654255623u,
2794 3771089254u, 2140443405u, 2779834738u, 3261942805u,
2795 3526889244u,
2796 1842009139u,
2797 4048484340u, 2106218403u, 2161244271u, 772152700u,
2798 1158647659u, 3776791619u, 3882186721u, 699525237u,
2799 2954670460u,
2800 1007105869u,
2801 3359152025u, 1146388699u, 1401550303u, 2326582541u,
2802 4181783540u, 1085644043u, 1942143795u, 1038368308u,
2803 1526153809u,
2804 4042547244u,
2805 1891441000u, 2573991874u, 1281441253u, 3635098284u,
2806 1980545715u, 825985487u, 3934748116u, 4228386979u,
2807 1480870944u,
2808 1042194545u,
2809 2397771642u, 2248490001u, 3817869868u, 878654626u,
2810 3785629484u, 1672470870u, 3229367873u, 1894538933u,
2811 1010692731u,
2812 1733824268u,
2813 656620328u, 3048283803u, 3353340056u, 2324965120u,
2814 4192585951u, 2284524675u, 3483884368u, 1510168293u,
2815 1554942691u,
2816 1309709396u,
2817 1241133168u, 3162179280u, 4046378054u, 3171681593u,
2818 1165297136u, 3496703563u, 150437903u, 1948622072u,
2819 1076332463u,
2820 2292479143u,
2821 1464229958u, 3479738093u, 2328067598u, 2334503110u,
2822 833324834u, 3981605747u, 3002629155u, 2854644186u,
2823 2832201336u,
2824 95796957u,
2825 3269249397u, 2358313329u, 3411860910u, 4283292480u,
2826 2802208697u, 1305947955u, 2156803420u, 1991340283u,
2827 189678024u,
2828 447602599u,
2829 1055411517u, 1531748363u, 1555852656u, 412402681u,
2830 3774988152u, 20597551u, 2925024131u, 1423989620u,
2831 3749428061u,
2832 1541439448u,
2833 112270416u, 1936224776u, 132162941u, 3772011507u,
2834 3814102518u, 1908807815u, 444154079u, 823765347u,
2835 3362275567u,
2836 3419047430u,
2837 2108287005u, 2315102125u, 658593738u, 3195094029u,
2838 3721937534u, 3176229204u, 3398835373u, 1271898712u,
2839 1142546577u,
2840 3185986817u,
2841 3562705803u, 2046119567u, 912990621u, 1829977672u,
2842 3459576979u, 1118045834u, 1369529376u, 3320601076u,
2843 3954988953u,
2844 4002467635u,
2845 3359456351u, 1314849568u, 1766750942u, 2998874853u,
2846 1181800239u, 707328036u, 3314954697u, 2066721120u,
2847 598194215u,
2848 1124451278u,
2849 3156679616u, 3742684743u, 2960199690u, 2683497915u,
2850 2566077529u, 937014607u, 102095219u, 4262922475u,
2851 3132264275u,
2852 1262099830u,
2853 862722905u, 2717653494u, 3245583534u, 3427209989u,
2854 3220278124u, 85457091u, 2222333500u, 3513997967u,
2855 3522324951u,
2856 2830855552u,
2857 2215004781u, 3482411840u, 4227160614u, 2030964411u,
2858 1741393851u, 2643723748u, 942813508u, 403442675u,
2859 3112048748u,
2860 530556423u,
2861 3817755244u, 3543286628u, 2247276090u, 1532920842u,
2862 4101962711u, 1446540991u, 3297821473u, 1861255389u,
2863 1984398u,
2864 2366525138u,
2865 377589481u, 3549193828u, 1427765914u, 506831657u,
2866 277278988u, 1447652775u, 3214362239u, 3142198690u,
2867 2843087541u,
2868 468915015u,
2869 807895062u, 2198723907u, 4031145069u, 2417156212u,
2870 4027298697u, 637175947u, 1229254212u, 1773257887u,
2871 1659444818u,
2872 451148891u,
2873 2099741368u, 735351990u, 2534775713u, 3261804619u,
2874 712519954u, 3527962772u, 3758642738u, 4245823575u,
2875 1281314264u,
2876 1167866160u,
2877 1489546151u, 1197354389u, 1043278102u, 2563326586u,
2878 371937794u, 2320164817u, 3189512691u, 573685198u,
2879 4108603513u,
2880 3758899588u,
2881 3507030163u, 2947201212u, 2529492585u, 578234375u,
2882 3362349842u, 3318878925u, 3611203517u, 3059253190u,
2883 4270755916u,
2884 4291274625u,
2885 4237586791u, 4137422245u, 2927218651u, 2444687041u,
2886 797128811u, 2043057612u, 396533859u, 2665256178u,
2887 3346510674u,
2888 1779586176u,
2889 3076562062u, 1882746214u, 921095362u, 2026988397u,
2890 514514911u, 3886379478u, 4218272420u, 1480386793u,
2891 3900160816u,
2892 2292273451u,
2893 1276138356u, 1125461821u, 1912885715u, 3365266013u,
2894 1333211627u, 4085009861u, 1390530102u, 3347984752u,
2895 2721771301u,
2896 1419492325u,
2897 4066766256u, 3250852311u, 820111852u, 1382201318u,
2898 2366036798u, 938032241u, 3100979439u, 487048687u,
2899 2292851045u,
2900 3241399180u,
2901 3912670510u, 2416437067u, 2973194517u, 3507707986u,
2902 1935099406u, 2533441488u, 104616731u, 2892622820u,
2903 3801190339u,
2904 4239188808u,
2905 807238241u, 3300121546u, 2249406147u, 4032114017u,
2906 3713738189u, 3324425575u, 4275607376u, 3663120298u,
2907 4173658372u,
2908 3984289690u,
2909 1827636846u, 3264588778u, 3297165529u, 558623533u,
2910 2728945672u, 1566297318u, 3447249966u, 481719551u,
2911 1596842050u,
2912 1838185946u,
2913 265271620u, 1050246315u, 4046655705u, 1844193138u,
2914 3807563245u, 1075384804u, 1292554949u, 1506525927u,
2915 2921816148u,
2916 2051885269u,
2917 1930534041u, 3872721086u, 1564489377u, 2272482181u,
2918 2849358683u, 589618304u, 2262072443u, 290363051u,
2919 299168363u,
2920 3867603931u,
2921 2868688756u, 2545263115u, 1092098533u, 3885725603u,
2922 2352430409u, 1981595469u, 2047946646u, 1332642839u,
2923 793806516u,
2924 214858837u,
2925 1061484659u, 3192394476u, 1115054785u, 3690637234u,
2926 996792368u, 2023479706u, 3046498231u, 4205835102u,
2927 3870714754u,
2928 257472875u,
2929 3549864599u, 2040276129u, 2414778670u, 812235477u,
2930 2674248196u, 1864096101u, 2257492689u, 1332556794u,
2931 1079540713u,
2932 465530720u,
2933 2304763972u, 830724724u, 3354588920u, 2510713652u,
2934 3103749409u, 468835585u, 1707620787u, 3038024846u,
2935 1000303198u,
2936 3462270146u,
2937 2748698899u, 2100348093u, 511537258u, 1237187486u,
2938 102049383u, 2268226698u, 3162251739u, 4219404629u,
2939 838822407u,
2940 1481440623u,
2941 2989224077u, 2676681975u, 3246551821u, 3812079906u,
2942 370572963u, 2283154352u, 3084789986u, 1961085583u,
2943 1955640586u,
2944 2409348147u,
2945 2284780581u, 1634818716u, 4018221729u, 2320761377u,
2946 3566831899u, 1799560520u, 91431959u, 1754113747u,
2947 1459430477u,
2948 3613658517u,
2949 924489906u, 3406317699u, 866289774u, 3924821603u,
2950 1265394945u, 1870668109u, 151949856u, 2747006534u,
2951 3111906201u,
2952 64039467u,
2953 2314447545u, 2600195638u, 4095795204u, 4162096026u,
2954 1026756826u, 2460047982u, 52686887u, 823198739u,
2955 1518045160u,
2956 2867527376u,
2957 566410761u, 2200433819u, 2114146405u, 2893790965u,
2958 881504901u, 974783212u, 490815659u, 937300283u,
2959 1523735309u,
2960 2511976468u,
2961 2634644947u, 355119367u, 1373773092u, 309232995u,
2962 3088671051u, 787126032u, 3442836843u, 4289194567u,
2963 2177850062u,
2964 1174136430u,
2965 3248982914u, 3129039732u, 1166851580u, 2196451882u,
2966 469595580u, 2130837700u, 3783349021u, 3745262548u,
2967 1236930515u,
2968 3032131496u,
2969 1525591437u, 1823628217u, 1939019255u, 1950270463u,
2970 3659899927u, 3688643445u, 3004399289u, 1155199552u,
2971 357547234u,
2972 2213110526u,
2973 3122658210u, 2667800490u, 2718690333u, 3512372076u,
2974 1098611683u, 2657518392u, 4248458835u, 3109874532u,
2975 1592908438u,
2976 2864927516u,
2977 3635248840u, 1251777186u, 3797340158u, 3508496870u,
2978 303354834u, 1482394062u, 2087100120u, 1595931912u,
2979 608574156u,
2980 723367884u,
2981 907938402u, 3357047807u, 1619629851u, 3092082995u,
2982 89030300u, 916336992u, 1861180168u, 3436334155u,
2983 1375000544u,
2984 3472936241u,
2985 1321217853u, 791356402u, 2872410224u, 2326250297u,
2986 2657644088u, 1748314108u, 4146771421u, 2913114440u,
2987 2924821844u,
2988 2101101496u,
2989 3268017251u, 2109603066u, 690665520u, 1830067573u,
2990 951427661u, 2982533150u, 3884512506u, 2358657479u,
2991 2833210784u,
2992 3419798214u,
2993 3785893994u, 2103940206u, 86759766u, 4031230616u,
2994 3745237192u, 2739453927u, 497038072u, 3303159408u,
2995 1251537249u,
2996 1993408196u,
2997 3185905715u, 2885948408u, 3154277110u, 2444150313u,
2998 2505582079u, 2120610195u, 3266465773u, 1814611964u,
2999 3080050407u,
3000 1079915522u,
3001 1819346505u, 2529946763u, 892097374u, 3740257161u,
3002 3618100441u, 1079900094u, 3607172225u, 737863389u,
3003 360704560u,
3004 3341993089u,
3005 1139047381u, 3132219631u, 1248981859u, 1109338159u,
3006 2004908615u, 4022302594u, 4166640860u, 2959140950u,
3007 3949235962u,
3008 2832278473u,
3009 2200524012u, 2634933043u, 2495844522u, 2613799818u,
3010 4034096813u, 683271795u, 1673546817u, 1363163726u,
3011 1805395136u,
3012 511749501u,
3013 1231032599u, 2305979751u, 345737783u, 3339868854u,
3014 2931857933u, 2323251738u, 1332068477u, 51846558u,
3015 3927238177u,
3016 1387182179u,
3017 1701238601u, 1419275173u, 2580882268u, 3357874599u,
3018 1726558907u, 1292901039u, 1371322339u, 1311713044u,
3019 3526735232u,
3020 4017884184u,
3021 3366093428u, 77140994u, 2128996229u, 1357915765u,
3022 4019691901u, 483989024u, 2390311750u, 2766065288u,
3023 3938587520u,
3024 3064810344u,
3025 1054589198u, 1274997019u, 4040589616u, 1277751144u,
3026 2274907047u, 4170399945u, 2886368209u, 4168922115u,
3027 3901237033u,
3028 3252972311u,
3029 2205185840u, 3403097556u, 3385493699u, 2809751370u,
3030 555319628u, 399539034u, 2998971454u, 1521596214u,
3031 178870216u,
3032 1471733541u,
3033 519629198u, 514159209u, 1500582242u, 1928616587u,
3034 2686427928u, 4133138798u, 1225914083u, 1432713584u,
3035 3559310915u,
3036 3925489366u,
3037 1055613123u, 4126676029u, 2723867653u, 3290604111u,
3038 1377022957u, 2373608155u, 3615237379u, 594338683u,
3039 2645257602u,
3040 2408427260u,
3041 917033274u, 750455097u, 625657657u, 121713200u,
3042 2191273413u, 4043949724u, 3293146785u, 3809297972u,
3043 3947296919u,
3044 115456894u,
3045 1529576616u, 1459278275u, 2157117997u, 1747859293u,
3046 4106665903u, 996939232u, 2007976332u, 4274649009u,
3047 1017725787u,
3048 4244666096u,
3049 1219631331u, 3072426253u, 3547691720u, 1620822012u,
3050 1397717508u, 2031597325u, 3345983430u, 2459068000u,
3051 3645130467u,
3052 2308642742u,
3053 359955852u, 1348467968u, 1133123059u, 2435919062u,
3054 2800365907u, 4213217210u, 4056565603u, 2811666556u,
3055 2318007236u,
3056 3823652401u,
3057 3654086429u, 1273260424u, 1591610446u, 943349350u,
3058 3441227678u, 3779964757u, 233818224u, 3469971032u,
3059 3764095096u,
3060 4009204587u,
3061 678472092u, 1990559652u, 2583121088u, 2978143652u,
3062 2496370864u, 2139539656u, 4287972050u, 295832576u,
3063 3536742861u,
3064 2257466133u,
3065 2738052161u, 1988611898u, 2466189642u, 3294419573u,
3066 2311186273u, 474374532u, 3081964174u, 2515138278u,
3067 835731677u,
3068 1178182694u,
3069 3352119543u, 2884763225u, 3462399574u, 2900817210u,
3070 1993698511u, 2868445043u, 2746444849u, 1205258179u,
3071 2353442946u,
3072 4079040070u,
3073 3624133102u, 2907136076u, 2902521697u, 426813211u,
3074 1418185512u, 3711189488u, 1351506552u, 1934749519u,
3075 46595543u,
3076 401688809u,
3077 3514602124u, 1396852607u, 1951477943u, 2502249173u,
3078 3199695820u, 2890250638u, 4205072507u, 1715623846u,
3079 3266686789u,
3080 3218688128u,
3081 1697759742u, 851227671u, 2358709645u, 4174233268u,
3082 500583683u, 3805940955u, 736234120u, 2710563712u,
3083 1949664540u,
3084 3139414003u,
3085 4293073253u, 1284406972u, 1785182449u, 1051548274u,
3086 2994248357u, 2499882522u, 717208669u, 2039517285u,
3087 518424929u,
3088 143136433u,
3089 2303774671u, 1272930860u, 2286410920u, 788459311u,
3090 273225293u, 2439291703u, 2254505236u, 3446287701u,
3091 3655156558u,
3092 1546628787u,
3093 340081500u, 3285722006u, 1324810435u, 1053980860u,
3094 1779472859u, 2700355724u, 686005017u, 3762376315u,
3095 3963193100u,
3096 1370881135u,
3097 661300087u, 1152753704u, 2349891598u, 3910051187u,
3098 2109444785u, 1311123870u, 2639837565u, 1896770931u,
3099 1081414128u,
3100 869877586u,
3101 4284220400u, 63045374u, 235968615u, 184451062u,
3102 1271099822u, 1319179857u, 3274963209u, 4172272710u,
3103 3388797445u,
3104 2965973320u,
3105 3793110097u, 3327241723u, 2991804005u, 1199544355u,
3106 771553759u, 2031749842u, 2596517372u, 1199888213u,
3107 858347951u,
3108 3340178832u,
3109 2903875412u, 763490382u, 76949161u, 2056544406u,
3110 1145227689u, 998233136u, 2354530024u, 427713587u,
3111 3537837347u,
3112 604661755u,
3113 923986833u, 1023730418u, 798294227u, 432557449u,
3114 801802449u, 1861313429u, 3899128441u, 4068407979u,
3115 2352677083u,
3116 3783539925u,
3117 10731973u, 3390767975u, 3949540249u, 1920121661u,
3118 3248580201u, 641956426u, 2104847395u, 604835744u,
3119 1491663404u,
3120 4255204651u,
3121 1520970746u, 2845653368u, 3247412938u, 3730629005u,
3122 855569514u, 3073294700u, 2429691698u, 3818342476u,
3123 3938869985u,
3124 2731201328u,
3125 2335202643u, 778117742u, 13298408u, 228780590u,
3126 2871715314u, 3253688653u, 4150999702u, 3846220408u,
3127 930808u,
3128 1397128726u,
3129 1964216488u, 2781092828u, 116285375u, 2271239476u,
3130 3724347554u, 2931203895u, 3893169206u, 1883912528u,
3131 2093892660u,
3132 3658787024u,
3133 3095016046u, 1094059199u, 3640239610u, 558564267u,
3134 2102812456u, 464734873u, 925262247u, 1609838036u,
3135 588364741u,
3136 1731409233u,
3137 1576165139u, 3933979268u, 375316394u, 4247099643u,
3138 3670508019u, 4080496835u, 2371248533u, 183762693u,
3139 2078935389u,
3140 2699810414u,
3141 1491815683u, 2999180789u, 1831158425u, 1603373553u,
3142 2006136905u, 3210230591u, 416748595u, 1536971415u,
3143 3271869367u,
3144 1266062739u,
3145 2138414557u, 3337114778u, 1634586826u, 36472629u,
3146 4482244u, 568009609u, 2721216780u, 4037289545u,
3147 2235138807u,
3148 1789351460u,
3149 4067539527u, 1323062829u, 3864620647u, 4192026301u,
3150 4278901241u, 1399025382u, 2826652805u, 1363860382u,
3151 1801770651u,
3152 1613381526u,
3153 1165249276u, 4046576622u, 2535596946u, 3260388176u,
3154 1078898578u, 2259750862u, 643387587u, 237144235u,
3155 4199571427u,
3156 3440917581u,
3157 3067939258u, 2018625455u, 1460528353u, 3138629939u,
3158 1666223528u, 3841139376u, 2528281125u, 885565193u,
3159 2609492686u,
3160 2517257479u,
3161 560864620u, 2261471820u, 3491559165u, 1329620416u,
3162 622383582u, 1759597655u, 2877873893u, 584692817u,
3163 1901728399u,
3164 2599000260u,
3165 3169771644u, 296332336u, 774719455u, 4175920823u,
3166 2287316070u, 4115615023u, 1073335619u, 4240292725u,
3167 1359158837u,
3168 1960974237u,
3169 3173724597u, 1619084286u, 2876340752u, 4065675347u,
3170 480741335u, 1237329941u, 701055566u, 3729009837u,
3171 1314736422u,
3172 4003180069u,
3173 3118519317u, 3035354420u, 3380357671u, 4020909015u,
3174 253958714u, 3545798863u, 3008185002u, 2624719888u,
3175 3219955575u,
3176 3060719376u,
3177 573101682u, 1580316843u, 2610493412u, 3490983536u,
3178 3601975611u, 851470366u, 635384901u, 3427048824u,
3179 1470002757u,
3180 3592460087u,
3181 2265226856u, 4124282457u, 2106385486u, 3334305617u,
3182 4208282753u, 3798749815u, 225396466u, 118791182u,
3183 2523395972u,
3184 194595464u,
3185 2563824631u, 2521301383u, 4224409406u, 468670274u,
3186 1761966400u, 1300908277u, 2570709228u, 1847901526u,
3187 1470099163u,
3188 2690466752u,
3189 1472536718u, 2399279735u, 4150607803u, 1775080054u,
3190 2082537685u, 4080034578u, 1256001880u, 392967725u,
3191 2055838940u,
3192 3349115816u,
3193 1745947263u, 2213925887u, 1836572741u, 2417722792u,
3194 636223705u, 2423329294u, 3960951311u, 1543591052u,
3195 1547914361u,
3196 2760945653u,
3197 3519014111u, 313543871u, 4119598884u, 1071003714u,
3198 2192556597u, 1526995535u, 3929839778u, 536388591u,
3199 3040873792u,
3200 3752682932u,
3201 1640614237u, 2432794021u, 385337403u, 2794410617u,
3202 2386128075u, 1055206708u, 1422747714u, 3759330929u,
3203 2533597496u,
3204 30440955u,
3205 1482899460u, 3350385050u, 616259409u, 3980103795u,
3206 1211364140u, 1040071544u, 594746920u, 1645973936u,
3207 2547331531u,
3208 1097726368u,
3209 700666526u, 2976247482u, 1144906608u, 996506677u,
3210 1997130756u, 800321417u, 1392942823u, 1601662248u,
3211 2079778663u,
3212 529512908u,
3213 2925120134u, 4106433085u, 630221833u, 2423086156u,
3214 1119859778u, 1726827981u, 1870859181u, 2559832707u,
3215 1792284257u,
3216 2059356387u,
3217 3572353364u, 3229407475u, 575621095u, 3221893291u,
3218 2372428048u, 2020123035u, 961449593u, 2243824063u,
3219 3803906611u,
3220 3735348189u,
3221 2981620804u, 4180681078u, 1555330629u, 230736535u,
3222 2075526640u, 749652975u, 713664372u, 2152096659u,
3223 2142067223u,
3224 3322302242u,
3225 1421646830u, 2092832615u, 1213735101u, 3192136753u,
3226 1106723940u, 3455398230u, 2541685524u, 2529956739u,
3227 3789430647u,
3228 1950084508u,
3229 2157395621u, 850457360u, 2758902426u, 2848030169u,
3230 6506379u, 1162213157u, 2981459221u, 272690871u,
3231 3059420255u,
3232 4242691285u,
3233 588065598u, 1206949936u, 3968214184u, 566348532u,
3234 126142880u, 1480567086u, 2959621988u, 2050218418u,
3235 2242731195u,
3236 3833514449u,
3237 1898070331u, 3687399477u, 3891859374u, 868185955u,
3238 2335308774u, 3676335246u, 3871121805u, 2189032743u,
3239 3275728647u,
3240 860492892u,
3241 1590764344u, 4130384758u, 262871548u, 3004764525u,
3242 2685542071u, 991231482u, 435122019u, 3031116998u,
3243 2898921700u,
3244 2917932604u,
3245 4238665148u, 2459072654u, 3444612545u, 4207731740u,
3246 1808564313u, 2798532269u, 3944553556u, 3926395409u,
3247 1633200670u,
3248 4138335224u,
3249 2524878605u, 4184292650u, 3563398268u, 4288943552u,
3250 3802121210u, 957502058u, 2410820887u, 4227117506u,
3251 4018625153u,
3252 4284329158u,
3253 530216712u, 2978986531u, 863452221u, 1910162118u,
3254 4088211378u, 4091971261u, 3150811451u, 4200871487u,
3255 3794038652u,
3256 3041564310u,
3257 2045287082u, 887805614u, 2889167251u, 4120352181u,
3258 1699912580u, 3478922097u, 3211994687u, 3136177842u,
3259 1500806861u,
3260 3211881347u,
3261 2147976385u, 3342722260u, 3359650541u, 4197378460u,
3262 781354073u, 1533623029u, 2204677828u, 3228172832u,
3263 3248592437u,
3264 3355841359u,
3265 560815159u, 1144951236u, 4027015711u, 2882625391u,
3266 339363613u, 2354572719u, 1769831876u, 4238589331u,
3267 1519732871u,
3268 2185834614u,
3269 1601096831u, 129709881u, 39655633u, 367604993u,
3270 1737681770u, 3259114599u, 2767070452u, 872365177u,
3271 1574125529u,
3272 3405020189u,
3273 4181346685u, 1134030380u, 403769171u, 2193351164u,
3274 1426232618u, 2885309450u, 3033612627u, 924948363u,
3275 935514094u,
3276 3202053329u,
3277 912294839u, 1618472324u, 4159158431u, 3744999487u,
3278 777064358u, 3974213124u, 1990246048u, 309725290u,
3279 2449849392u,
3280 1943692420u,
3281 2288635750u, 2433793635u, 2168904061u, 683315308u,
3282 3081493019u, 3477759434u, 3815496269u, 2823504699u,
3283 586945121u,
3284 3088963200u,
3285 3492287335u, 636875049u, 1111206944u, 2037346120u,
3286 1282050044u, 1409681512u, 1786128584u, 755810950u,
3287 2332676758u,
3288 2178142310u,
3289 957827166u, 1014983590u, 1888800725u, 3608595803u,
3290 3200072714u, 2534008478u, 659336139u, 1281728287u,
3291 4060560529u,
3292 2915575125u,
3293 3521503774u, 2926487340u, 1096297674u, 653489861u,
3294 2352326980u, 2561136777u, 1224141198u, 1250479629u,
3295 1297625391u,
3296 2409997371u,
3297 1942483722u, 2481835750u, 1394715707u, 1673070941u,
3298 2456039704u, 3980558014u, 3547934764u, 1882038812u,
3299 1078160498u,
3300 2488279087u,
3301 1848235245u, 1211914722u, 2264928765u, 2807773070u,
3302 270145554u, 583747883u, 3826009010u, 2996618216u,
3303 425727157u,
3304 992726957u,
3305 3384462280u, 726650661u, 1955043265u, 1923879512u,
3306 1854693773u, 2987614542u, 2660044993u, 2457260810u,
3307 426299370u,
3308 2671892900u,
3309 1827308087u, 3083953443u, 1791749638u, 3265087416u,
3310 2119752201u, 2547122538u, 3990783236u, 1912713468u,
3311 3688865211u,
3312 1815780016u,
3313 303699291u, 2416763742u, 2690891610u, 1535193548u,
3314 1107803989u, 1504143133u, 2235270371u, 2545884083u,
3315 2276278682u,
3316 411724404u,
3317 3416925704u, 2565792091u, 3383911757u, 546058824u,
3318 3374654444u, 2364630415u, 2693473470u, 2622125691u,
3319 261864817u,
3320 55682470u,
3321 857617568u, 141304067u, 1885488541u, 155368182u,
3322 1281949051u, 3384522408u, 3254816901u, 1959816782u,
3323 1452224057u,
3324 2830267691u,
3325 3709231247u, 58988202u, 4218130458u, 2984061349u,
3326 1888707848u, 4223605071u, 4241442486u, 375269213u,
3327 3208327038u,
3328 2199916493u,
3329 550337252u, 2855061437u, 276088636u, 114362204u,
3330 2321163647u, 2127813633u, 3289403024u, 2686973202u,
3331 2717376797u,
3332 3593428039u,
3333 3648831666u, 890925902u, 3289404818u, 3289516821u,
3334 4248913260u, 1858916580u, 3303932308u, 1752797086u,
3335 1628149686u,
3336 3245893605u,
3337 1568537311u, 2844194502u, 1593855770u, 2408174109u,
3338 124797514u, 2085649512u, 3188565660u, 2264996276u,
3339 1926696513u,
3340 3053957740u,
3341 2238806881u, 2189050973u, 203685243u, 379855590u,
3342 3920271562u, 1058600179u, 3698061923u, 4255106849u,
3343 608401664u,
3344 1598041932u,
3345 3318266418u, 2535016555u, 852760884u, 1918098822u,
3346 2200437599u, 1532285043u, 3425662132u, 3561293706u,
3347 2231633206u,
3348 4108785088u,
3349 3359152801u, 173534780u, 208383607u, 2862988169u,
3350 2406642243u, 426814583u, 2777335795u, 3322703596u,
3351 954190623u,
3352 615093090u,
3353 4179102978u, 2452847930u, 100239619u, 42471741u,
3354 818352432u, 2190624654u, 504379960u, 3631619975u,
3355 633412456u,
3356 1018421783u,
3357 842645419u, 711808707u, 3424580813u, 2132457941u,
3358 1158335882u, 3567952480u, 2302183699u, 1145788151u,
3359 3474264138u,
3360 3105085243u,
3361 3115506027u, 2783713015u, 3871785309u, 539583269u,
3362 1400252405u, 3857849984u, 4231186588u, 1278653799u,
3363 1760227022u,
3364 761044088u,
3365 3838185417u, 2439542532u, 585283357u, 2055995220u,
3366 937117124u, 3831944855u, 1823586038u, 3287917855u,
3367 485082427u,
3368 3209172809u,
3369 1984570176u, 2818337297u, 2691869057u, 3790476953u,
3370 839035557u, 3203129010u, 669981176u, 4121157385u,
3371 3519870450u,
3372 3792633352u,
3373 3017650322u, 1603459507u, 4225677666u, 376555451u,
3374 473780127u, 2018786277u, 3299822439u, 1010254499u,
3375 2383887565u,
3376 3155009499u,
3377 3108110655u, 2641738274u, 3684908622u, 1606463047u,
3378 3311068174u, 52708046u, 754181455u, 1018079176u,
3379 3915670272u,
3380 3366999425u,
3381 1012880204u, 1339439715u, 466437962u, 1402662350u,
3382 2504046911u, 736323938u, 2037800124u, 1725908589u,
3383 716341840u,
3384 1750123474u,
3385 3366342464u, 1743666195u, 2975303189u, 3821364027u,
3386 3253707772u, 3635548377u, 3840413796u, 1955642085u,
3387 1018315169u,
3388 1258092848u,
3389 2095540656u, 1076256607u, 117289557u, 1311658655u,
3390 2118301000u, 68721550u, 2886814107u, 2712432819u,
3391 4201862886u,
3392 753807148u,
3393 1940229047u, 731347296u, 1068901393u, 3873155894u,
3394 2852787666u, 1973464853u, 79735652u, 3966380587u,
3395 3245740712u,
3396 2525773438u,
3397 734938109u, 3045656416u, 3335746354u, 4099732691u,
3398 1911896517u, 1697006473u, 1145487066u, 1605663299u,
3399 3053606724u,
3400 2386289465u,
3401 3821211369u, 1006215345u, 1256304829u, 1053001668u,
3402 1289194958u, 118761054u, 1853688730u, 2803418011u,
3403 188650809u,
3404 3763686458u,
3405 1006829556u, 2961984133u, 3390525025u, 2061199893u,
3406 141792681u, 2439893463u, 2652982650u, 1804942682u,
3407 1546510005u,
3408 1246961405u,
3409 2407577046u, 565772575u, 3751844810u, 2943166103u,
3410 3750052451u, 3022527280u, 25162928u, 397381043u,
3411 1818337632u,
3412 3447363730u,
3413 3936437150u, 2569420703u, 2215592390u, 2171555672u,
3414 3665571006u, 4021712412u, 2939158353u, 4057813172u,
3415 1823237318u,
3416 103999245u,
3417 3251978010u, 3591914940u, 3582495283u, 2519035265u,
3418 3905726135u, 3180393349u, 2743117123u, 55247368u,
3419 3325286701u,
3420 705195946u,
3421 1857526853u, 1480518550u, 3809990433u, 1398189338u,
3422 3126362926u, 3959531492u, 1503658285u, 1977847740u,
3423 3043964489u,
3424 2613086143u,
3425 1518119282u, 4238434900u, 3905746486u, 3064949667u,
3426 1028122931u, 3309119457u, 4071194920u, 3096098907u,
3427 4137180520u,
3428 494467959u,
3429 1231408687u, 1691606157u, 1793452569u, 2722196118u,
3430 3478603952u, 1059665738u, 2282032278u, 3990268388u,
3431 1719514651u,
3432 4248311578u,
3433 3799146721u, 898026304u, 3367808954u, 4162472815u,
3434 170495870u, 1308116609u, 3428285344u, 1714716475u,
3435 395576794u,
3436 4153638621u,
3437 2999745812u, 3483315953u, 304980828u, 595337120u,
3438 3486516729u, 2331563143u, 2583609459u, 1885928417u,
3439 3834283777u,
3440 979337825u,
3441 932057378u, 3124081189u, 1930356777u, 3865887996u,
3442 4178282217u, 4214219408u, 3669465884u, 1472413856u,
3443 3356866587u,
3444 1012769806u,
3445 3043639963u, 996996396u, 207308216u, 982967331u,
3446 2991319933u, 318066902u, 721489670u, 1249967713u,
3447 749240921u,
3448 591392325u,
3449 2379365192u, 2250868849u, 2163259329u, 143191325u,
3450 3778285606u, 982149096u, 3536906200u, 2244353244u,
3451 1443862317u,
3452 3161549210u,
3453 2183127464u, 2015409516u, 547003700u, 2032484282u,
3454 523677821u, 4275663308u, 3827205526u, 3903778273u,
3455 2444530525u,
3456 2543645801u,
3457 1173958423u, 784740616u, 2878693675u, 3127696736u,
3458 3832037316u, 3161002398u, 4084166400u, 4213346853u,
3459 223390424u,
3460 4273380883u,
3461 2130315482u, 3429606032u, 3367732613u, 1912357694u,
3462 422632590u, 1266957023u, 3437535648u, 736404240u,
3463 2281709372u,
3464 415859912u,
3465 212948797u, 351612650u, 3920561440u, 112963586u,
3466 2230727543u, 2851076612u, 1990662634u, 2264296857u,
3467 3131463650u,
3468 2704034623u,
3469 3541637839u, 2954232792u, 533986918u, 4158757533u,
3470 65174248u, 4232639593u, 865906667u, 1948225652u,
3471 779656112u,
3472 3873989249u,
3473 2372984749u, 2346988193u, 1104345713u, 1165654138u,
3474 4045762610u, 3588205178u, 461363991u, 1111215752u,
3475 1389675192u,
3476 2404325151u,
3477 2152228101u, 3808973622u, 1901235912u, 3458690696u,
3478 314513238u, 2539459143u, 2847998873u, 952026138u,
3479 2325705328u,
3480 407844712u,
3481 3727960715u, 2996448351u, 2374336760u, 3138756390u,
3482 2600015243u, 539980418u, 1876285352u, 1670330799u,
3483 1709360377u,
3484 2868531654u,
3485 494777964u, 2773053597u, 599486162u, 3962209577u,
3486 1871328846u, 2171933018u, 110279472u, 384074780u,
3487 4147021936u,
3488 2333589647u,
3489 4251778066u, 40493468u, 3099342316u, 4108779767u,
3490 2812424588u, 954542332u, 2040682331u, 2251152306u,
3491 45915516u,
3492 259525626u,
3493 1045384743u, 4134656562u, 749389261u, 874399445u,
3494 616549904u, 2200447504u, 436024539u, 78972290u,
3495 3210485762u,
3496 1907985531u,
3497 3013721395u, 4214533685u, 4198804243u, 534879265u,
3498 1517190881u, 3756787754u, 1152563554u, 1718750948u,
3499 777737463u,
3500 1402478860u,
3501 1824562784u, 1879401449u, 3515818786u, 513165201u,
3502 1423491227u, 2103067918u, 2291777410u, 1097943000u,
3503 };
3504
3505 // Return false only if offset is -1 and a spot check of 3 hashes all yield 0.
3506 bool Test(int offset, int len = 0) {
3507 #undef Check
3508 #undef IsAlive
3509
3510 #define Check(x) do { \
3511 const uint32_t actual = (x), e = expected[index++]; \
3512 bool ok = actual == e; \
3513 if (!ok) { \
3514 cerr << "expected " << hex << e << " but got " << actual << endl; \
3515 ++errors; \
3516 } \
3517 assert(ok); \
3518 } while (0)
3519
3520 #define IsAlive(x) do { alive += IsNonZero(x); } while (0)
3521
3522 // After the following line is where the uses of "Check" and such will go.
3523 static int index = 0;
3524 if (offset == -1) { int alive = 0; IsAlive(farmhashcc::Hash32WithSeed(data, len+ +, SEED)); IsAlive(farmhashcc::Hash32(data, len++)); { uint128_t u = farmhashcc: :Fingerprint128(data, len++); uint64_t h = Uint128Low64(u); IsAlive(h >> 32); Is Alive((h << 32) >> 32); h = Uint128High64(u); IsAlive(h >> 32); IsAlive((h << 32 ) >> 32); } len -= 3; return alive > 0; }
3525 Check(farmhashcc::Hash32WithSeed(data + offset, len, SEED));
3526 Check(farmhashcc::Hash32(data + offset, len));
3527 { uint128_t u = farmhashcc::Fingerprint128(data + offset, len); uint64_t h = Uin t128Low64(u); Check(h >> 32); Check((h << 32) >> 32); h = Uint128High64(u); Chec k(h >> 32); Check((h << 32) >> 32); }
3528 { uint128_t u = farmhashcc::CityHash128WithSeed(data + offset, len, Uint128(SEED 0, SEED1)); uint64_t h = Uint128Low64(u); Check(h >> 32); Check((h << 32) >> 32) ; h = Uint128High64(u); Check(h >> 32); Check((h << 32) >> 32); }
3529
3530 return true;
3531 #undef Check
3532 #undef IsAlive
3533 }
3534
3535 int RunTest() {
3536 Setup();
3537 int i = 0;
3538 cout << "Running farmhashccTest";
3539 if (!Test(-1)) {
3540 cout << "... Unavailable\n";
3541 return NoteErrors();
3542 }
3543 // Good. The function is attempting to hash, so run the full test.
3544 int errors_prior_to_test = errors;
3545 for ( ; i < kTestSize - 1; i++) {
3546 Test(i * i, i);
3547 }
3548 for ( ; i < kDataSize; i += i / 7) {
3549 Test(0, i);
3550 }
3551 Test(0, kDataSize);
3552 cout << (errors == errors_prior_to_test ? "... OK\n" : "... Failed\n");
3553 return NoteErrors();
3554 }
3555
3556 #else
3557
3558 // After the following line is where the code to print hash codes will go.
3559 void Dump(int offset, int len) {
3560 cout << farmhashcc::Hash32WithSeed(data + offset, len, SEED) << "u," << endl;
3561 cout << farmhashcc::Hash32(data + offset, len) << "u," << endl;
3562 { uint128_t u = farmhashcc::Fingerprint128(data + offset, len); uint64_t h = Uin t128Low64(u); cout << (h >> 32) << "u, " << ((h << 32) >> 32) << "u, "; h = Uint 128High64(u); cout << (h >> 32) << "u, " << ((h << 32) >> 32) << "u," << endl; }
3563 { uint128_t u = farmhashcc::CityHash128WithSeed(data + offset, len, Uint128(SEED 0, SEED1)); uint64_t h = Uint128Low64(u); cout << (h >> 32) << "u, " << ((h << 3 2) >> 32) << "u, "; h = Uint128High64(u); cout << (h >> 32) << "u, " << ((h << 3 2) >> 32) << "u," << endl; }
3564 }
3565
3566 #endif
3567
3568 #undef SEED
3569 #undef SEED1
3570 #undef SEED0
3571
3572 } // namespace farmhashccTest
3573
3574 #if TESTING
3575
3576 static int farmhashccTestResult = farmhashccTest::RunTest();
3577
3578 #else
3579 int main(int argc, char** argv) {
3580 Setup();
3581 cout << "uint32_t expected[] = {\n";
3582 int i = 0;
3583 for ( ; i < kTestSize - 1; i++) {
3584 farmhashccTest::Dump(i * i, i);
3585 }
3586 for ( ; i < kDataSize; i += i / 7) {
3587 farmhashccTest::Dump(0, i);
3588 }
3589 farmhashccTest::Dump(0, kDataSize);
3590 cout << "};\n";
3591 }
3592 #endif
3593 #ifndef FARMHASH_SELF_TEST_GUARD
3594 #define FARMHASH_SELF_TEST_GUARD
3595 #include <cstdio>
3596 #include <iostream>
3597 #include <string.h>
3598
3599 using std::cout;
3600 using std::cerr;
3601 using std::endl;
3602 using std::hex;
3603
3604 static const uint64_t kSeed0 = 1234567;
3605 static const uint64_t kSeed1 = k0;
3606 static const int kDataSize = 1 << 20;
3607 static const int kTestSize = 300;
3608 #define kSeed128 Uint128(kSeed0, kSeed1)
3609
3610 static char data[kDataSize];
3611
3612 static int completed_self_tests = 0;
3613 static int errors = 0;
3614
3615 // Initialize data to pseudorandom values.
3616 void Setup() {
3617 if (completed_self_tests == 0) {
3618 uint64_t a = 9;
3619 uint64_t b = 777;
3620 for (int i = 0; i < kDataSize; i++) {
3621 a += b;
3622 b += a;
3623 a = (a ^ (a >> 41)) * k0;
3624 b = (b ^ (b >> 41)) * k0 + i;
3625 uint8_t u = b >> 37;
3626 memcpy(data + i, &u, 1); // uint8_t -> char
3627 }
3628 }
3629 }
3630
3631 int NoteErrors() {
3632 #define NUM_SELF_TESTS 9
3633 if (++completed_self_tests == NUM_SELF_TESTS)
3634 std::exit(errors > 0);
3635 return errors;
3636 }
3637
3638 template <typename T> inline bool IsNonZero(T x) {
3639 return x != 0;
3640 }
3641
3642 template <> inline bool IsNonZero<uint128_t>(uint128_t x) {
3643 return x != Uint128(0, 0);
3644 }
3645
3646 #endif // FARMHASH_SELF_TEST_GUARD
3647
3648 namespace farmhashmkTest {
3649
3650 uint32_t CreateSeed(int offset, int salt) {
3651 uint32_t h = static_cast<uint32_t>(salt & 0xffffffff);
3652 h = h * c1;
3653 h ^= (h >> 17);
3654 h = h * c1;
3655 h ^= (h >> 17);
3656 h = h * c1;
3657 h ^= (h >> 17);
3658 h += static_cast<uint32_t>(offset & 0xffffffff);
3659 h = h * c1;
3660 h ^= (h >> 17);
3661 h = h * c1;
3662 h ^= (h >> 17);
3663 h = h * c1;
3664 h ^= (h >> 17);
3665 return h;
3666 }
3667
3668 #undef SEED
3669 #undef SEED1
3670 #undef SEED0
3671 #define SEED CreateSeed(offset, -1)
3672 #define SEED0 CreateSeed(offset, 0)
3673 #define SEED1 CreateSeed(offset, 1)
3674
3675 #undef TESTING
3676 #define TESTING 1
3677 #if TESTING
3678 uint32_t expected[] = {
3679 4223616069u,
3680 3696677242u,
3681 4081014168u,
3682 2576519988u,
3683 2212771159u,
3684 1112731063u,
3685 1020067935u,
3686 3955445564u,
3687 1451961420u,
3688 653440099u,
3689 31917516u,
3690 2957164615u,
3691 2590087362u,
3692 3879448744u,
3693 176305566u,
3694 2447367541u,
3695 1359016305u,
3696 3363804638u,
3697 1117290165u,
3698 1062549743u,
3699 2437877004u,
3700 1894455839u,
3701 673206794u,
3702 3486923651u,
3703 3269862919u,
3704 2303349487u,
3705 1380660650u,
3706 595525107u,
3707 1525325287u,
3708 2025609358u,
3709 176408838u,
3710 1592885012u,
3711 864896482u,
3712 2101378090u,
3713 3489229104u,
3714 2118965695u,
3715 581644891u,
3716 2718789079u,
3717 631613207u,
3718 4228658372u,
3719 3867875546u,
3720 3531368319u,
3721 3804516756u,
3722 3317755099u,
3723 1619744564u,
3724 2884717286u,
3725 1088213445u,
3726 2667691076u,
3727 3727873235u,
3728 2330406762u,
3729 3616470388u,
3730 967660719u,
3731 4148162586u,
3732 315219121u,
3733 673084328u,
3734 3047602355u,
3735 1598963653u,
3736 1267826661u,
3737 2117362589u,
3738 2861192253u,
3739 1823625377u,
3740 1380350078u,
3741 1641748342u,
3742 1176094482u,
3743 269384321u,
3744 2178982315u,
3745 3480237248u,
3746 2660755208u,
3747 1850544433u,
3748 3429699438u,
3749 1262819303u,
3750 640556464u,
3751 2421125401u,
3752 2188368608u,
3753 2612932825u,
3754 1474432581u,
3755 173790449u,
3756 2124882189u,
3757 831272654u,
3758 622960146u,
3759 4238751051u,
3760 3250317967u,
3761 2120810248u,
3762 1948231495u,
3763 1389029321u,
3764 2200398357u,
3765 2134232963u,
3766 2948072329u,
3767 617717625u,
3768 681164587u,
3769 114859387u,
3770 430545646u,
3771 57239089u,
3772 3163338012u,
3773 3482496399u,
3774 557662576u,
3775 1102441413u,
3776 2670159360u,
3777 991116729u,
3778 846014240u,
3779 4233741566u,
3780 1802317242u,
3781 3129528802u,
3782 1459456375u,
3783 1305643039u,
3784 3258671612u,
3785 1578285833u,
3786 868590079u,
3787 1631034517u,
3788 1695432937u,
3789 561078856u,
3790 1004115553u,
3791 3086090507u,
3792 3818348650u,
3793 731596645u,
3794 780926790u,
3795 2544205955u,
3796 158479164u,
3797 3983514188u,
3798 2004735250u,
3799 3436218400u,
3800 673684751u,
3801 1463431419u,
3802 2880490219u,
3803 3223748024u,
3804 2218318859u,
3805 1474466194u,
3806 2636437533u,
3807 2206794961u,
3808 140995728u,
3809 1186394086u,
3810 1805716888u,
3811 1640037724u,
3812 3942729099u,
3813 1944727013u,
3814 918951560u,
3815 498666871u,
3816 3486974657u,
3817 2967205462u,
3818 1167253804u,
3819 1884281041u,
3820 2866015002u,
3821 4158319270u,
3822 2627220079u,
3823 3733319624u,
3824 3317092271u,
3825 438323662u,
3826 3195868065u,
3827 3426606709u,
3828 360708338u,
3829 1905491012u,
3830 650004803u,
3831 1351266252u,
3832 3133279000u,
3833 3722811115u,
3834 2722412434u,
3835 918432408u,
3836 3678271248u,
3837 269599647u,
3838 621514057u,
3839 3117077855u,
3840 1545425390u,
3841 2597567410u,
3842 1221437820u,
3843 3493254589u,
3844 102787342u,
3845 918861168u,
3846 348795089u,
3847 3439883229u,
3848 2353641807u,
3849 2209585469u,
3850 4035884492u,
3851 2686995435u,
3852 1649888022u,
3853 3852893848u,
3854 3042700028u,
3855 314103172u,
3856 726977769u,
3857 2489830276u,
3858 2872753660u,
3859 1316214989u,
3860 1488801501u,
3861 1811420390u,
3862 639581627u,
3863 2362837215u,
3864 3634581834u,
3865 3648576802u,
3866 1257314182u,
3867 762118371u,
3868 4268447045u,
3869 730167096u,
3870 755561509u,
3871 882614845u,
3872 3696972894u,
3873 228263661u,
3874 1478636142u,
3875 2767751651u,
3876 1532617116u,
3877 3838657661u,
3878 1944359935u,
3879 1401102137u,
3880 3772933173u,
3881 1050098254u,
3882 1658079354u,
3883 1846025728u,
3884 2204244794u,
3885 2017217424u,
3886 1275162853u,
3887 1429816745u,
3888 2175565479u,
3889 1716109139u,
3890 1187506761u,
3891 2434641075u,
3892 2725597783u,
3893 1795687662u,
3894 1393312782u,
3895 3511565397u,
3896 627885430u,
3897 4145733164u,
3898 2519005353u,
3899 231414775u,
3900 1242015635u,
3901 2760723497u,
3902 2185540568u,
3903 727314436u,
3904 2358790354u,
3905 1186393454u,
3906 4234795645u,
3907 350567813u,
3908 866773875u,
3909 3145590392u,
3910 1158374055u,
3911 3903123687u,
3912 1862119793u,
3913 2204587556u,
3914 4266276976u,
3915 4151548555u,
3916 915250402u,
3917 2874695320u,
3918 2360311410u,
3919 1099212769u,
3920 1271542714u,
3921 3473148363u,
3922 1637325418u,
3923 1807795989u,
3924 2493819794u,
3925 3800917924u,
3926 4001205856u,
3927 2582153621u,
3928 3365872040u,
3929 2890146216u,
3930 2626363824u,
3931 3133351295u,
3932 4046827296u,
3933 3053118771u,
3934 4113026751u,
3935 884356716u,
3936 3828347401u,
3937 10608262u,
3938 830987972u,
3939 1841080500u,
3940 3202717763u,
3941 3561778749u,
3942 1906000052u,
3943 3058284660u,
3944 1432904514u,
3945 2567431677u,
3946 2550162530u,
3947 665557986u,
3948 936887821u,
3949 2101205308u,
3950 4253535847u,
3951 1662043545u,
3952 1253611611u,
3953 2091370094u,
3954 2635077370u,
3955 2602176041u,
3956 3624115809u,
3957 748442714u,
3958 2709749154u,
3959 1023493343u,
3960 860291012u,
3961 3924715584u,
3962 1536436740u,
3963 2551145800u,
3964 2391782865u,
3965 1467705048u,
3966 2583909796u,
3967 3616666170u,
3968 1162857372u,
3969 4228631071u,
3970 1510132376u,
3971 2739165009u,
3972 2656606142u,
3973 3454996358u,
3974 3155038853u,
3975 1022087316u,
3976 100044110u,
3977 494208296u,
3978 2746186477u,
3979 4216782431u,
3980 225448834u,
3981 3728320521u,
3982 335282866u,
3983 3148194874u,
3984 953503703u,
3985 1293353960u,
3986 202372387u,
3987 1326119870u,
3988 4045123735u,
3989 3819994846u,
3990 1629004186u,
3991 1081099186u,
3992 3591584153u,
3993 1670825804u,
3994 3404257979u,
3995 3262192301u,
3996 2572846095u,
3997 3714992543u,
3998 4264142572u,
3999 529616678u,
4000 2882154574u,
4001 3006354178u,
4002 3865969421u,
4003 2007174907u,
4004 308283107u,
4005 2629833703u,
4006 3159124075u,
4007 1146492131u,
4008 494104332u,
4009 493149727u,
4010 1342910585u,
4011 521642387u,
4012 2201695937u,
4013 2517980959u,
4014 2426821287u,
4015 777374655u,
4016 2228189792u,
4017 4027055486u,
4018 228976000u,
4019 3842083468u,
4020 1723920223u,
4021 1192126094u,
4022 787744493u,
4023 2740368380u,
4024 2284153001u,
4025 2773829458u,
4026 442000614u,
4027 387830783u,
4028 2169780670u,
4029 2253144627u,
4030 3532502484u,
4031 1969684059u,
4032 1165351416u,
4033 3055056536u,
4034 3582324253u,
4035 231419363u,
4036 770979865u,
4037 3213983597u,
4038 3690452836u,
4039 935794639u,
4040 3230602762u,
4041 2841762457u,
4042 407598927u,
4043 1164479891u,
4044 3721799696u,
4045 354738136u,
4046 1801566618u,
4047 3206038542u,
4048 2621379981u,
4049 1943487262u,
4050 3534745636u,
4051 1074424589u,
4052 1304517521u,
4053 4133400969u,
4054 2339317978u,
4055 2135116860u,
4056 4180643791u,
4057 2415309340u,
4058 1855926417u,
4059 3418648630u,
4060 1968113037u,
4061 597304222u,
4062 3668824865u,
4063 3810008716u,
4064 3014702569u,
4065 3151212026u,
4066 156057449u,
4067 373134533u,
4068 2068234004u,
4069 191580563u,
4070 3832754488u,
4071 2924104199u,
4072 2026044494u,
4073 4065780435u,
4074 122565840u,
4075 4194985167u,
4076 2744823717u,
4077 2494098735u,
4078 3753793370u,
4079 1885739217u,
4080 2488161225u,
4081 3643797615u,
4082 2653367310u,
4083 2494061477u,
4084 189968132u,
4085 899646597u,
4086 392100396u,
4087 4012318310u,
4088 3855777086u,
4089 3566860954u,
4090 2698574996u,
4091 2414249905u,
4092 1330623339u,
4093 1263222732u,
4094 1277741760u,
4095 2194959402u,
4096 1629656136u,
4097 120494320u,
4098 1072368005u,
4099 1084245077u,
4100 4011372748u,
4101 1366613353u,
4102 3108643228u,
4103 3332219532u,
4104 2114746095u,
4105 3964007334u,
4106 371687128u,
4107 1084813876u,
4108 126459896u,
4109 4292782331u,
4110 321283184u,
4111 398168499u,
4112 3604983506u,
4113 560701543u,
4114 2073961354u,
4115 4240841868u,
4116 4151211362u,
4117 1338986875u,
4118 4093476832u,
4119 2269279497u,
4120 3500846299u,
4121 2510225147u,
4122 598000444u,
4123 1330391422u,
4124 1432533385u,
4125 4171226231u,
4126 426821154u,
4127 2932270996u,
4128 3378981077u,
4129 2217871549u,
4130 1619647984u,
4131 4051608043u,
4132 3180237819u,
4133 12919578u,
4134 1375401767u,
4135 371320427u,
4136 2986640571u,
4137 2336669859u,
4138 3796464715u,
4139 1892383284u,
4140 306814912u,
4141 2125823211u,
4142 1863678891u,
4143 3249703818u,
4144 3840225752u,
4145 281579900u,
4146 264680257u,
4147 4266359110u,
4148 4182229890u,
4149 2239659703u,
4150 3627947372u,
4151 2373929191u,
4152 224082765u,
4153 4053639058u,
4154 1862360303u,
4155 3187739624u,
4156 3392706679u,
4157 948039509u,
4158 817505760u,
4159 1215842393u,
4160 3462222651u,
4161 536021853u,
4162 182346832u,
4163 2731944883u,
4164 2346674384u,
4165 2640961678u,
4166 3446695687u,
4167 2271722179u,
4168 1301069656u,
4169 2803881468u,
4170 2832614405u,
4171 1691544398u,
4172 698756814u,
4173 3980620906u,
4174 3565421410u,
4175 754769376u,
4176 4115923404u,
4177 3909962218u,
4178 2747614077u,
4179 2888289845u,
4180 1016920862u,
4181 2790946178u,
4182 3067070960u,
4183 3173251481u,
4184 1572132982u,
4185 255048203u,
4186 2996538818u,
4187 3405398987u,
4188 136106013u,
4189 3581605228u,
4190 4277437977u,
4191 2147300534u,
4192 3728426265u,
4193 3483629996u,
4194 1478452694u,
4195 20756076u,
4196 2774992067u,
4197 432987927u,
4198 1516771026u,
4199 3511588664u,
4200 2130994978u,
4201 509385406u,
4202 873090347u,
4203 2163904107u,
4204 4192239086u,
4205 2532489989u,
4206 1090772651u,
4207 3910797408u,
4208 3710882132u,
4209 155010959u,
4210 1369823531u,
4211 1599664937u,
4212 4035593587u,
4213 1212746925u,
4214 795822552u,
4215 116689518u,
4216 3674240941u,
4217 1135576664u,
4218 756750261u,
4219 1027431362u,
4220 390555140u,
4221 2228460216u,
4222 1506940482u,
4223 3733857700u,
4224 3048762971u,
4225 2511703196u,
4226 548609887u,
4227 1607354252u,
4228 659053982u,
4229 259884450u,
4230 1793130460u,
4231 4083364495u,
4232 3148555881u,
4233 1764350138u,
4234 2436485683u,
4235 4031563025u,
4236 3261860724u,
4237 2475833430u,
4238 2101726086u,
4239 3191176464u,
4240 2646658847u,
4241 2127042126u,
4242 771316100u,
4243 2115922959u,
4244 3208515045u,
4245 2355437783u,
4246 3621147793u,
4247 1580163615u,
4248 3211555675u,
4249 3299188490u,
4250 191613920u,
4251 466733956u,
4252 2939029038u,
4253 1509152039u,
4254 130591314u,
4255 1892874677u,
4256 1646908044u,
4257 3452406523u,
4258 3998376606u,
4259 1199243832u,
4260 2187108812u,
4261 3189230066u,
4262 4161151481u,
4263 3371454980u,
4264 3681788646u,
4265 180842187u,
4266 3685022399u,
4267 3058749895u,
4268 3250165163u,
4269 2895367943u,
4270 2627101723u,
4271 771755098u,
4272 1332921024u,
4273 3638871848u,
4274 514215135u,
4275 3591227378u,
4276 2300310870u,
4277 3689533503u,
4278 851607114u,
4279 114330368u,
4280 2709027386u,
4281 1743034877u,
4282 1013693860u,
4283 288169008u,
4284 3545190686u,
4285 1052165084u,
4286 3995862307u,
4287 96902755u,
4288 1097819851u,
4289 2645431442u,
4290 2184148618u,
4291 2151206566u,
4292 350979797u,
4293 3467920900u,
4294 421116779u,
4295 1246252u,
4296 4057835428u,
4297 329324407u,
4298 4104482417u,
4299 844624570u,
4300 3306265806u,
4301 3787625025u,
4302 4263241191u,
4303 3251413927u,
4304 2921204431u,
4305 2931915325u,
4306 992134330u,
4307 3986338354u,
4308 1327895216u,
4309 1458363596u,
4310 1480608532u,
4311 728594368u,
4312 3804366693u,
4313 794404223u,
4314 1643240863u,
4315 793417255u,
4316 4167916443u,
4317 2683488959u,
4318 3124925324u,
4319 4184843652u,
4320 3750971752u,
4321 308509829u,
4322 1054550805u,
4323 2797511972u,
4324 4043123412u,
4325 1587158240u,
4326 4050518606u,
4327 3030062190u,
4328 2589912753u,
4329 603440067u,
4330 937013191u,
4331 1071662315u,
4332 2100661456u,
4333 2602005741u,
4334 435516078u,
4335 2260470147u,
4336 1256268350u,
4337 3612035u,
4338 3368856141u,
4339 151516099u,
4340 3081868591u,
4341 3363755681u,
4342 2049963149u,
4343 2885320434u,
4344 84682005u,
4345 2411758308u,
4346 2695174275u,
4347 3099904644u,
4348 1787308684u,
4349 1132379308u,
4350 564634346u,
4351 510236510u,
4352 2804443681u,
4353 3931864252u,
4354 2064427949u,
4355 1893979229u,
4356 2916544974u,
4357 1885887717u,
4358 2978018250u,
4359 494192125u,
4360 2642662373u,
4361 901112508u,
4362 636035003u,
4363 1658643797u,
4364 172746975u,
4365 517504890u,
4366 3440019372u,
4367 4144498044u,
4368 1854755456u,
4369 3672653905u,
4370 4176892856u,
4371 382159097u,
4372 282871690u,
4373 3629300472u,
4374 2500754041u,
4375 1677659759u,
4376 1067175061u,
4377 161654075u,
4378 1672575536u,
4379 346120493u,
4380 2730229631u,
4381 203466442u,
4382 1244549529u,
4383 199761971u,
4384 2744895408u,
4385 3195315331u,
4386 2124618519u,
4387 3261045496u,
4388 985339699u,
4389 3385585455u,
4390 1545740710u,
4391 3636652160u,
4392 2167020081u,
4393 1207897204u,
4394 28752417u,
4395 2895834146u,
4396 3640845375u,
4397 3750293073u,
4398 548997850u,
4399 4207814196u,
4400 4183030708u,
4401 2462810989u,
4402 3929965401u,
4403 };
4404
4405 // Return false only if offset is -1 and a spot check of 3 hashes all yield 0.
4406 bool Test(int offset, int len = 0) {
4407 #undef Check
4408 #undef IsAlive
4409
4410 #define Check(x) do { \
4411 const uint32_t actual = (x), e = expected[index++]; \
4412 bool ok = actual == e; \
4413 if (!ok) { \
4414 cerr << "expected " << hex << e << " but got " << actual << endl; \
4415 ++errors; \
4416 } \
4417 assert(ok); \
4418 } while (0)
4419
4420 #define IsAlive(x) do { alive += IsNonZero(x); } while (0)
4421
4422 // After the following line is where the uses of "Check" and such will go.
4423 static int index = 0;
4424 if (offset == -1) { int alive = 0; IsAlive(farmhashmk::Hash32WithSeed(data, len+ +, SEED)); IsAlive(farmhashmk::Hash32(data, len++)); IsAlive(farmhashmk::Hash32( data, len++)); len -= 3; return alive > 0; }
4425 Check(farmhashmk::Hash32WithSeed(data + offset, len, SEED));
4426 Check(farmhashmk::Hash32(data + offset, len));
4427
4428 return true;
4429 #undef Check
4430 #undef IsAlive
4431 }
4432
4433 int RunTest() {
4434 Setup();
4435 int i = 0;
4436 cout << "Running farmhashmkTest";
4437 if (!Test(-1)) {
4438 cout << "... Unavailable\n";
4439 return NoteErrors();
4440 }
4441 // Good. The function is attempting to hash, so run the full test.
4442 int errors_prior_to_test = errors;
4443 for ( ; i < kTestSize - 1; i++) {
4444 Test(i * i, i);
4445 }
4446 for ( ; i < kDataSize; i += i / 7) {
4447 Test(0, i);
4448 }
4449 Test(0, kDataSize);
4450 cout << (errors == errors_prior_to_test ? "... OK\n" : "... Failed\n");
4451 return NoteErrors();
4452 }
4453
4454 #else
4455
4456 // After the following line is where the code to print hash codes will go.
4457 void Dump(int offset, int len) {
4458 cout << farmhashmk::Hash32WithSeed(data + offset, len, SEED) << "u," << endl;
4459 cout << farmhashmk::Hash32(data + offset, len) << "u," << endl;
4460 }
4461
4462 #endif
4463
4464 #undef SEED
4465 #undef SEED1
4466 #undef SEED0
4467
4468 } // namespace farmhashmkTest
4469
4470 #if TESTING
4471
4472 static int farmhashmkTestResult = farmhashmkTest::RunTest();
4473
4474 #else
4475 int main(int argc, char** argv) {
4476 Setup();
4477 cout << "uint32_t expected[] = {\n";
4478 int i = 0;
4479 for ( ; i < kTestSize - 1; i++) {
4480 farmhashmkTest::Dump(i * i, i);
4481 }
4482 for ( ; i < kDataSize; i += i / 7) {
4483 farmhashmkTest::Dump(0, i);
4484 }
4485 farmhashmkTest::Dump(0, kDataSize);
4486 cout << "};\n";
4487 }
4488 #endif
4489 #ifndef FARMHASH_SELF_TEST_GUARD
4490 #define FARMHASH_SELF_TEST_GUARD
4491 #include <cstdio>
4492 #include <iostream>
4493 #include <string.h>
4494
4495 using std::cout;
4496 using std::cerr;
4497 using std::endl;
4498 using std::hex;
4499
4500 static const uint64_t kSeed0 = 1234567;
4501 static const uint64_t kSeed1 = k0;
4502 static const int kDataSize = 1 << 20;
4503 static const int kTestSize = 300;
4504 #define kSeed128 Uint128(kSeed0, kSeed1)
4505
4506 static char data[kDataSize];
4507
4508 static int completed_self_tests = 0;
4509 static int errors = 0;
4510
4511 // Initialize data to pseudorandom values.
4512 void Setup() {
4513 if (completed_self_tests == 0) {
4514 uint64_t a = 9;
4515 uint64_t b = 777;
4516 for (int i = 0; i < kDataSize; i++) {
4517 a += b;
4518 b += a;
4519 a = (a ^ (a >> 41)) * k0;
4520 b = (b ^ (b >> 41)) * k0 + i;
4521 uint8_t u = b >> 37;
4522 memcpy(data + i, &u, 1); // uint8_t -> char
4523 }
4524 }
4525 }
4526
4527 int NoteErrors() {
4528 #define NUM_SELF_TESTS 9
4529 if (++completed_self_tests == NUM_SELF_TESTS)
4530 std::exit(errors > 0);
4531 return errors;
4532 }
4533
4534 template <typename T> inline bool IsNonZero(T x) {
4535 return x != 0;
4536 }
4537
4538 template <> inline bool IsNonZero<uint128_t>(uint128_t x) {
4539 return x != Uint128(0, 0);
4540 }
4541
4542 #endif // FARMHASH_SELF_TEST_GUARD
4543
4544 namespace farmhashnaTest {
4545
4546 uint32_t CreateSeed(int offset, int salt) {
4547 uint32_t h = static_cast<uint32_t>(salt & 0xffffffff);
4548 h = h * c1;
4549 h ^= (h >> 17);
4550 h = h * c1;
4551 h ^= (h >> 17);
4552 h = h * c1;
4553 h ^= (h >> 17);
4554 h += static_cast<uint32_t>(offset & 0xffffffff);
4555 h = h * c1;
4556 h ^= (h >> 17);
4557 h = h * c1;
4558 h ^= (h >> 17);
4559 h = h * c1;
4560 h ^= (h >> 17);
4561 return h;
4562 }
4563
4564 #undef SEED
4565 #undef SEED1
4566 #undef SEED0
4567 #define SEED CreateSeed(offset, -1)
4568 #define SEED0 CreateSeed(offset, 0)
4569 #define SEED1 CreateSeed(offset, 1)
4570
4571 #undef TESTING
4572 #define TESTING 1
4573 #if TESTING
4574 uint32_t expected[] = {
4575 1140953930u, 861465670u,
4576 3277735313u, 2681724312u,
4577 2598464059u, 797982799u,
4578 890626835u, 800175912u,
4579 2603993599u, 921001710u,
4580 1410420968u, 2134990486u,
4581 3283896453u, 1867689945u,
4582 2914424215u, 2244477846u,
4583 255297188u, 2992121793u,
4584 1110588164u, 4186314283u,
4585 161451183u, 3943596029u,
4586 4019337850u, 452431531u,
4587 283198166u, 2741341286u,
4588 3379021470u, 2557197665u,
4589 299850021u, 2532580744u,
4590 452473466u, 1706958772u,
4591 1298374911u, 3099673830u,
4592 2199864459u, 3696623795u,
4593 236935126u, 2976578695u,
4594 4055299123u, 3281581178u,
4595 1053458494u, 1882212500u,
4596 2305012065u, 2169731866u,
4597 3456121707u, 275903667u,
4598 458884671u, 3033004529u,
4599 3058973506u, 2379411653u,
4600 1898235244u, 1402319660u,
4601 2700149065u, 2699376854u,
4602 147814787u, 720739346u,
4603 2433714046u, 4222949502u,
4604 4220361840u, 1712034059u,
4605 3425469811u, 3690733394u,
4606 4148372108u, 1330324210u,
4607 594028478u, 2921867846u,
4608 1635026870u, 192883107u,
4609 780716741u, 1728752234u,
4610 3280331829u, 326029180u,
4611 3969463346u, 1436364519u,
4612 393215742u, 3349570000u,
4613 3824583307u, 1612122221u,
4614 2859809759u, 3808705738u,
4615 1379537552u, 1646032583u,
4616 2233466664u, 1432476832u,
4617 4023053163u, 2650381482u,
4618 2052294713u, 3552092450u,
4619 1628777059u, 1499109081u,
4620 3476440786u, 3829307897u,
4621 2960536756u, 1554038301u,
4622 1145519619u, 3190844552u,
4623 2902102606u, 3600725550u,
4624 237495366u, 540224401u,
4625 65721842u, 489963606u,
4626 1448662590u, 397635823u,
4627 1596489240u, 1562872448u,
4628 1790705123u, 2128624475u,
4629 180854224u, 2604346966u,
4630 1435705557u, 1262831810u,
4631 155445229u, 1672724608u,
4632 1669465176u, 1341975128u,
4633 663607706u, 2077310004u,
4634 3610042449u, 1911523866u,
4635 1043692997u, 1454396064u,
4636 2563776023u, 294527927u,
4637 1099072299u, 1389770549u,
4638 703505868u, 678706990u,
4639 2952353448u, 2026137563u,
4640 3603803785u, 629449419u,
4641 1933894405u, 3043213226u,
4642 226132789u, 2489287368u,
4643 1552847036u, 645684964u,
4644 3828089804u, 3632594520u,
4645 187883449u, 230403464u,
4646 3151491850u, 3272648435u,
4647 3729087873u, 1303930448u,
4648 2002861219u, 165370827u,
4649 916494250u, 1230085527u,
4650 3103338579u, 3064290191u,
4651 3807265751u, 3628174014u,
4652 231181488u, 851743255u,
4653 2295806711u, 1781190011u,
4654 2988893883u, 1554380634u,
4655 1142264800u, 3667013118u,
4656 1968445277u, 315203929u,
4657 2638023604u, 2290487377u,
4658 732137533u, 1909203251u,
4659 440398219u, 1891630171u,
4660 1380301172u, 1498556724u,
4661 4072067757u, 4165088768u,
4662 4204318635u, 441430649u,
4663 3931792696u, 197618179u,
4664 956300927u, 914413116u,
4665 3010839769u, 2837339569u,
4666 2148126371u, 1913303225u,
4667 3074915312u, 3117299654u,
4668 4139181436u, 2993479124u,
4669 3178848746u, 1357272220u,
4670 1438494951u, 507436733u,
4671 667183474u, 2084369203u,
4672 3854939912u, 1413396341u,
4673 126024219u, 146044391u,
4674 1016656857u, 3022024459u,
4675 3254014218u, 429095991u,
4676 165589978u, 1578546616u,
4677 985653208u, 1718653828u,
4678 623071693u, 366414107u,
4679 249776086u, 1207522198u,
4680 3047342438u, 2991127487u,
4681 3120876698u, 1684583131u,
4682 46987739u, 1157614300u,
4683 863214540u, 1087193030u,
4684 199124911u, 520792961u,
4685 3614377032u, 586863115u,
4686 3331828431u, 1013201099u,
4687 1716848157u, 4033596884u,
4688 1164298657u, 4140791139u,
4689 1146169032u, 1434258493u,
4690 3824360466u, 3242407770u,
4691 3725511003u, 232064808u,
4692 872586426u, 762243036u,
4693 2736953692u, 816692935u,
4694 512845449u, 3748861010u,
4695 2266795890u, 3781899767u,
4696 4290630595u, 517646945u,
4697 22638523u, 648000590u,
4698 959214578u, 558910384u,
4699 1283799121u, 3047062993u,
4700 1024246061u, 4027776454u,
4701 3544509313u, 622325861u,
4702 834785312u, 382936554u,
4703 411505255u, 1973395102u,
4704 1825135056u, 2725923798u,
4705 580988377u, 2826990641u,
4706 3474970689u, 1029055034u,
4707 812546227u, 2506885666u,
4708 2584372201u, 1758123094u,
4709 589567754u, 325737734u,
4710 345313518u, 2022370576u,
4711 3886113119u, 3338548567u,
4712 257578986u, 3698087965u,
4713 1776047957u, 1771384107u,
4714 3604937815u, 3198590202u,
4715 2305332220u, 191910725u,
4716 4232136669u, 427759438u,
4717 4244322689u, 542201663u,
4718 3315355162u, 2135941665u,
4719 556609672u, 45845311u,
4720 1175961330u, 3948351189u,
4721 23075771u, 3252374102u,
4722 1634635545u, 4151937410u,
4723 713127376u, 1467786451u,
4724 663013031u, 3444053918u,
4725 2638154051u, 810082938u,
4726 3077742128u, 1062268187u,
4727 2115441882u, 4081398201u,
4728 3735739145u, 2794294783u,
4729 2335576331u, 2560479831u,
4730 1379288194u, 4225182569u,
4731 2442302747u, 3948961926u,
4732 3958366652u, 3067277639u,
4733 3667516477u, 1709989541u,
4734 1516711748u, 2339636583u,
4735 4188504038u, 59581167u,
4736 2725013602u, 3639843023u,
4737 2658147000u, 2643979752u,
4738 3758739543u, 4189944477u,
4739 2470483982u, 877580602u,
4740 2995362413u, 118817200u,
4741 3252925478u, 2062343506u,
4742 3981838403u, 3762572073u,
4743 1231633714u, 4168280671u,
4744 2931588131u, 3284356565u,
4745 1129162571u, 732225574u,
4746 4173605289u, 1407328702u,
4747 1677744031u, 3532596884u,
4748 3232041815u, 1652884780u,
4749 2256541290u, 3459463480u,
4750 3740979556u, 259034107u,
4751 2227121257u, 1426140634u,
4752 3606709555u, 3424793077u,
4753 315836068u, 3200749877u,
4754 1386256573u, 24035717u,
4755 2982018998u, 1811050648u,
4756 234531934u, 1115203611u,
4757 1598686658u, 3146815575u,
4758 1603559457u, 323296368u,
4759 2632963283u, 1778459926u,
4760 739944537u, 579625482u,
4761 3486330348u, 492621815u,
4762 1231665285u, 2457048126u,
4763 3903349120u, 389846205u,
4764 3355404249u, 3275550588u,
4765 1052645068u, 862072556u,
4766 2834153464u, 1481069623u,
4767 2657392572u, 4279236653u,
4768 1688445808u, 701920051u,
4769 3740748788u, 3388062747u,
4770 1873358321u, 2152785640u,
4771 883382081u, 1005815394u,
4772 1020177209u, 734239551u,
4773 2371453141u, 100326520u,
4774 3488500412u, 1279682138u,
4775 2610427744u, 49703572u,
4776 3026361211u, 605900428u,
4777 302392721u, 2509302188u,
4778 1416453607u, 2815915291u,
4779 1862819968u, 519710058u,
4780 2450888314u, 4017598378u,
4781 937074653u, 3035635454u,
4782 1590230729u, 3268013438u,
4783 2710029305u, 12886044u,
4784 3711259084u, 2627383582u,
4785 3895772404u, 648534979u,
4786 260307902u, 855990313u,
4787 3669691805u, 263366740u,
4788 2938543471u, 414331688u,
4789 3080542944u, 3405007814u,
4790 3565059103u, 1190977418u,
4791 390836981u, 1606450012u,
4792 2649808239u, 2514169310u,
4793 2747519432u, 4129538640u,
4794 1721522849u, 492099164u,
4795 792990594u, 3625507637u,
4796 2271095827u, 2993032712u,
4797 2302363854u, 4013112951u,
4798 1111617969u, 2183845740u,
4799 795918276u, 1116991810u,
4800 3110898804u, 3963062126u,
4801 2737064702u, 462795667u,
4802 937372240u, 1343017609u,
4803 1091041189u, 2790555455u,
4804 277024217u, 25485284u,
4805 1166522068u, 1623631848u,
4806 241727183u, 2836158787u,
4807 3112996740u, 573836428u,
4808 2721658101u, 1937681565u,
4809 4175169209u, 3190765433u,
4810 1970000788u, 1668258120u,
4811 114616703u, 954762543u,
4812 199237753u, 4094644498u,
4813 2522281978u, 732086117u,
4814 1756889687u, 2936126607u,
4815 2437031370u, 4103143808u,
4816 3883389541u, 3171090854u,
4817 2483004780u, 1927385370u,
4818 2360538162u, 2740855009u,
4819 4241185118u, 1492209542u,
4820 1672737098u, 2148675559u,
4821 1789864670u, 2434313103u,
4822 2319172611u, 2760941207u,
4823 2636210123u, 1338083267u,
4824 1128080590u, 822806371u,
4825 1199583556u, 314727461u,
4826 1335160250u, 2084630531u,
4827 1156261526u, 316766066u,
4828 112090465u, 3129033323u,
4829 2746885618u, 636616055u,
4830 2582210744u, 1721064910u,
4831 3468394263u, 470463518u,
4832 2076016059u, 408721884u,
4833 2121041886u, 378460278u,
4834 1915948002u, 357324860u,
4835 2301682622u, 2691859523u,
4836 1869756364u, 2429314418u,
4837 2193146527u, 1185564327u,
4838 2614088922u, 1975527044u,
4839 919067651u, 2855948894u,
4840 3662539576u, 1943802836u,
4841 3529473373u, 1490330107u,
4842 366036094u, 3384241033u,
4843 4276268604u, 448403661u,
4844 4271796078u, 1910401882u,
4845 3077107698u, 299427366u,
4846 2035665349u, 3201262636u,
4847 3738454258u, 2554452696u,
4848 3588997135u, 3363895827u,
4849 1267505995u, 1852004679u,
4850 2237827073u, 2803250686u,
4851 3468044908u, 2143572850u,
4852 1728158656u, 1022551180u,
4853 1996680960u, 839529273u,
4854 2400647871u, 2201096054u,
4855 3606433628u, 2597259793u,
4856 3544595875u, 3909443124u,
4857 819278607u, 3447346709u,
4858 806136613u, 2711436388u,
4859 3656063205u, 837475154u,
4860 694525336u, 4070212073u,
4861 4011303412u, 1068395209u,
4862 438095290u, 484603494u,
4863 2673730227u, 737767009u,
4864 642310823u, 3914002299u,
4865 308425103u, 268427550u,
4866 1334387085u, 4069797497u,
4867 4280783219u, 2914011058u,
4868 4243643405u, 2849988118u,
4869 2504230175u, 1817156623u,
4870 2804200483u, 3406991497u,
4871 2948254999u, 2102063419u,
4872 1071272117u, 514889942u,
4873 571972433u, 1246595599u,
4874 1735616066u, 1539151988u,
4875 1230831543u, 277987182u,
4876 4269526481u, 991511607u,
4877 95237878u, 2005032160u,
4878 1291113144u, 626619670u,
4879 3560835907u, 164940926u,
4880 1433635018u, 116647396u,
4881 3039097112u, 2868163232u,
4882 1141645918u, 1764165478u,
4883 881378302u, 2159170082u,
4884 2953647681u, 1011320066u,
4885 184856151u, 1723308975u,
4886 336034862u, 2017579106u,
4887 1476681709u, 147523618u,
4888 3896252223u, 2264728166u,
4889 944743644u, 1694443528u,
4890 2690700128u, 1947321519u,
4891 735478508u, 4058183171u,
4892 260177668u, 505662155u,
4893 2391691262u, 1920739747u,
4894 3216960415u, 1898176786u,
4895 3722741628u, 1511077569u,
4896 449636564u, 983350414u,
4897 2580237367u, 2055059789u,
4898 1103819072u, 2089123665u,
4899 3873755579u, 2718467458u,
4900 3124338704u, 3204250304u,
4901 2475035432u, 1120017626u,
4902 3873758287u, 1982999824u,
4903 2950794582u, 780634378u,
4904 2842141483u, 4029205195u,
4905 1656892865u, 3330993377u,
4906 80890710u, 1953796601u,
4907 3873078673u, 136118734u,
4908 2317676604u, 4199091610u,
4909 1864448181u, 3063437608u,
4910 1699452298u, 1403506686u,
4911 1513069466u, 2348491299u,
4912 4273657745u, 4055855649u,
4913 1805475756u, 2562064338u,
4914 973124563u, 4197091358u,
4915 172861513u, 2858726767u,
4916 4271866024u, 3071338162u,
4917 3590386266u, 2328277259u,
4918 1096050703u, 1189614342u,
4919 459509140u, 771592405u,
4920 817999971u, 3740825152u,
4921 520400189u, 1941874618u,
4922 185232757u, 4032960199u,
4923 3928245258u, 3527721294u,
4924 1301118856u, 752188080u,
4925 3512945009u, 308584855u,
4926 2105373972u, 752872278u,
4927 3823368815u, 3760952096u,
4928 4250142168u, 2565680167u,
4929 3646354146u, 1259957455u,
4930 1085857127u, 3471066607u,
4931 38924274u, 3770488806u,
4932 1083869477u, 3312508103u,
4933 71956383u, 3738784936u,
4934 3099963860u, 1255084262u,
4935 4286969992u, 3621849251u,
4936 1190908967u, 1831557743u,
4937 2363435042u, 54945052u,
4938 4059585566u, 4023974274u,
4939 1788578453u, 3442180039u,
4940 2534883189u, 2432427547u,
4941 3909757989u, 731996369u,
4942 4168347425u, 1356028512u,
4943 2741583197u, 1280920000u,
4944 312887059u, 3259015297u,
4945 3946278527u, 4135481831u,
4946 1281043691u, 1121403845u,
4947 3312292477u, 1819941269u,
4948 1741932545u, 3293015483u,
4949 2127558730u, 713121337u,
4950 2635469238u, 486003418u,
4951 4015067527u, 2976737859u,
4952 2108187161u, 927011680u,
4953 1970188338u, 4177613234u,
4954 1799789551u, 2118505126u,
4955 4134691985u, 1958963937u,
4956 1929210029u, 2555835851u,
4957 2768832862u, 910892050u,
4958 2567532373u, 4075249328u,
4959 86689814u, 3726640307u,
4960 1392137718u, 1240000030u,
4961 4104757832u, 3026358429u,
4962 313797689u, 1435798509u,
4963 3101500919u, 1241665335u,
4964 3573008472u, 3615577014u,
4965 3767659003u, 3134294021u,
4966 4063565523u, 2296824134u,
4967 1541946015u, 3087190425u,
4968 2693152531u, 2199672572u,
4969 2123763822u, 1034244398u,
4970 857839960u, 2515339233u,
4971 2228007483u, 1628096047u,
4972 2116502287u, 2502657424u,
4973 2809830736u, 460237542u,
4974 450205998u, 3646921704u,
4975 3818199357u, 1808504491u,
4976 1950698961u, 2069753399u,
4977 3657033172u, 3734547671u,
4978 4067859590u, 3292597295u,
4979 1106466069u, 356742959u,
4980 2469567432u, 3495418823u,
4981 183440071u, 3248055817u,
4982 3662626864u, 1750561299u,
4983 3926138664u, 4088592524u,
4984 567122118u, 3810297651u,
4985 992181339u, 3384018814u,
4986 3272124369u, 3177596743u,
4987 320086295u, 2316548367u,
4988 100741310u, 451656820u,
4989 4086604273u, 3759628395u,
4990 2553391092u, 1745659881u,
4991 3650357479u, 2390172694u,
4992 330172533u, 767377322u,
4993 526742034u, 4102497288u,
4994 2088767754u, 164402616u,
4995 2482632320u, 2352347393u,
4996 1873658044u, 3861555476u,
4997 2751052984u, 1767810825u,
4998 20037241u, 545143220u,
4999 2594532522u, 472304191u,
5000 3441135892u, 3323383489u,
5001 258785117u, 2977745165u,
5002 2781737565u, 2963590112u,
5003 2756998822u, 207428029u,
5004 2581558559u, 3824717027u,
5005 1258619503u, 3472047571u,
5006 2648427775u, 2360400900u,
5007 2393763818u, 2332399088u,
5008 3932701729u, 884421165u,
5009 1396468647u, 1377764574u,
5010 4061795938u, 1559119087u,
5011 3343596838u, 3604258095u,
5012 1435134775u, 1099809675u,
5013 908163739u, 1418405656u,
5014 368446627u, 3741651161u,
5015 3374512975u, 3542220540u,
5016 3244772570u, 200009340u,
5017 3198975081u, 2521038253u,
5018 4081637863u, 337070226u,
5019 3235259030u, 3897262827u,
5020 736956644u, 641040550u,
5021 644850146u, 1306761320u,
5022 4219448634u, 193750500u,
5023 3293278106u, 1383997679u,
5024 1242645122u, 4109252858u,
5025 450747727u, 3716617561u,
5026 362725793u, 2252520167u,
5027 3377483696u, 1788337208u,
5028 8130777u, 3226734120u,
5029 759239140u, 1012411364u,
5030 1658628529u, 2911512007u,
5031 1002580201u, 1681898320u,
5032 3039016929u, 4294520281u,
5033 367022558u, 3071359622u,
5034 3205848570u, 152989999u,
5035 3839042136u, 2357687350u,
5036 4273132307u, 3898950547u,
5037 1176841812u, 1314157485u,
5038 75443951u, 1027027239u,
5039 1858986613u, 2040551642u,
5040 36574105u, 2603059541u,
5041 3456147251u, 2137668425u,
5042 4077477194u, 3565689036u,
5043 491832241u, 363703593u,
5044 2579177168u, 3589545214u,
5045 265993036u, 1864569342u,
5046 4149035573u, 3189253455u,
5047 1072259310u, 3153745937u,
5048 923017956u, 490608221u,
5049 855846773u, 845706553u,
5050 1018226240u, 1604548872u,
5051 3833372385u, 3287246572u,
5052 2757959551u, 2452872151u,
5053 1553870564u, 1713154780u,
5054 2649450292u, 500120236u,
5055 84251717u, 661869670u,
5056 1444911517u, 2489716881u,
5057 2810524030u, 1561519055u,
5058 3884088359u, 2509890699u,
5059 4247155916u, 1005636939u,
5060 3224066062u, 2774151984u,
5061 2035978240u, 2514910366u,
5062 1478837908u, 3144450144u,
5063 2107011431u, 96459446u,
5064 3587732908u, 2389230590u,
5065 3287635953u, 250533792u,
5066 1235983679u, 4237425634u,
5067 3704645833u, 3882376657u,
5068 2976369049u, 1187061987u,
5069 276949224u, 4100839753u,
5070 1698347543u, 1629662314u,
5071 1556151829u, 3784939568u,
5072 427484362u, 4246879223u,
5073 3155311770u, 4285163791u,
5074 1693376813u, 124492786u,
5075 1858777639u, 3476334357u,
5076 1941442701u, 1121980173u,
5077 3485932087u, 820852908u,
5078 358032121u, 2511026735u,
5079 1873607283u, 2556067450u,
5080 2248275536u, 1528632094u,
5081 1535473864u, 556796152u,
5082 1499201704u, 1472623890u,
5083 1526518503u, 3692729434u,
5084 1476438092u, 2913077464u,
5085 335109599u, 2167614601u,
5086 4121131078u, 3158127917u,
5087 3051522276u, 4046477658u,
5088 2857717851u, 1863977403u,
5089 1341023343u, 692059110u,
5090 1802040304u, 990407433u,
5091 3285847572u, 319814144u,
5092 561105582u, 1540183799u,
5093 4052924496u, 2926590471u,
5094 2244539806u, 439121871u,
5095 3317903224u, 3178387550u,
5096 4265214507u, 82077489u,
5097 1978918971u, 4279668976u,
5098 128732476u, 2853224222u,
5099 464407878u, 4190838199u,
5100 997819001u, 3250520802u,
5101 2330081301u, 4095846095u,
5102 733509243u, 1583801700u,
5103 722314527u, 3552883023u,
5104 1403784280u, 432327540u,
5105 1877837196u, 3912423882u,
5106 505219998u, 696031431u,
5107 908238873u, 4189387259u,
5108 8759461u, 2540185277u,
5109 3385159748u, 381355877u,
5110 2519951681u, 1679786240u,
5111 2019419351u, 4051584612u,
5112 1933923923u, 3768201861u,
5113 1670133081u, 3454981037u,
5114 700836153u, 1675560450u,
5115 371560700u, 338262316u,
5116 847351840u, 2222395828u,
5117 3130433948u, 405251683u,
5118 3037574880u, 184098830u,
5119 453340528u, 1385561439u,
5120 2224044848u, 4071581802u,
5121 1431235296u, 5570097u,
5122 570114376u, 2287305551u,
5123 2272418128u, 803575837u,
5124 3943113491u, 414959787u,
5125 708083137u, 2452657767u,
5126 4019147902u, 3841480082u,
5127 3791794715u, 2965956183u,
5128 2763690963u, 2350937598u,
5129 3424361375u, 779434428u,
5130 1274947212u, 686105485u,
5131 3426668051u, 3692865672u,
5132 3057021940u, 2285701422u,
5133 349809124u, 1379278508u,
5134 3623750518u, 215970497u,
5135 1783152480u, 823305654u,
5136 216118434u, 1787189830u,
5137 3692048450u, 2272612521u,
5138 3032187389u, 4159715581u,
5139 1388133148u, 1611772864u,
5140 2544383526u, 552925303u,
5141 3420960112u, 3198900547u,
5142 3503230228u, 2603352423u,
5143 2318375898u, 4064071435u,
5144 3006227299u, 4194096960u,
5145 1283392422u, 1510460996u,
5146 174272138u, 3671038966u,
5147 1775955687u, 1719108984u,
5148 1763892006u, 1385029063u,
5149 4083790740u, 406757708u,
5150 684087286u, 531310503u,
5151 3329923157u, 3492083607u,
5152 1059031410u, 3037314475u,
5153 3105682208u, 3382290593u,
5154 2292208503u, 426380557u,
5155 97373678u, 3842309471u,
5156 777173623u, 3241407531u,
5157 303065016u, 1477104583u,
5158 4234905200u, 2512514774u,
5159 2649684057u, 1397502982u,
5160 1802596032u, 3973022223u,
5161 2543566442u, 3139578968u,
5162 3193669211u, 811750340u,
5163 4013496209u, 567361887u,
5164 4169410406u, 3622282782u,
5165 3403136990u, 2540585554u,
5166 895210040u, 3862229802u,
5167 1145435213u, 4146963980u,
5168 784952939u, 943914610u,
5169 573034522u, 464420660u,
5170 2356867109u, 3054347639u,
5171 3985088434u, 1911188923u,
5172 583391304u, 176468511u,
5173 2990150068u, 2338031599u,
5174 519948041u, 3181425568u,
5175 496106033u, 4110294665u,
5176 2736756930u, 1196757691u,
5177 1089679033u, 240953857u,
5178 3399092928u, 4040779538u,
5179 2843673626u, 240495962u,
5180 3017658263u, 3828377737u,
5181 4243717901u, 2448373688u,
5182 2759616657u, 2246245780u,
5183 308018483u, 4262383425u,
5184 2731780771u, 328023017u,
5185 2884443148u, 841480070u,
5186 3188015819u, 4051263539u,
5187 2298178908u, 2944209234u,
5188 1372958390u, 4164532914u,
5189 4074952232u, 1683612329u,
5190 2155036654u, 1872815858u,
5191 2041174279u, 2368092311u,
5192 206775997u, 2283918569u,
5193 645945606u, 115406202u,
5194 4206471368u, 3923500892u,
5195 2217060665u, 350160869u,
5196 706531239u, 2824302286u,
5197 509981657u, 1469342315u,
5198 140980u, 1891558063u,
5199 164887091u, 3094962711u,
5200 3437115622u, 13327420u,
5201 422986366u, 330624974u,
5202 3630863408u, 2425505046u,
5203 824008515u, 3543885677u,
5204 918718096u, 376390582u,
5205 3224043675u, 3724791476u,
5206 1837192976u, 2968738516u,
5207 3424344721u, 3187805406u,
5208 1550978788u, 1743089918u,
5209 4251270061u, 645016762u,
5210 3855037968u, 1928519266u,
5211 1373803416u, 2289007286u,
5212 1889218686u, 1610271373u,
5213 3059200728u, 2108753646u,
5214 582042641u, 812347242u,
5215 3188172418u, 191994904u,
5216 1343511943u, 2247006571u,
5217 463291708u, 2697254095u,
5218 1534175504u, 1106275740u,
5219 622521957u, 917121602u,
5220 4095777215u, 3955972648u,
5221 3852234638u, 2845309942u,
5222 3299763344u, 2864033668u,
5223 2554947496u, 799569078u,
5224 2551629074u, 1102873346u,
5225 2661022773u, 2006922227u,
5226 2900438444u, 1448194126u,
5227 1321567432u, 1983773590u,
5228 1237256330u, 3449066284u,
5229 1691553115u, 3274671549u,
5230 4271625619u, 2741371614u,
5231 3285899651u, 786322314u,
5232 1586632825u, 564385522u,
5233 2530557509u, 2974240289u,
5234 1244759631u, 3263135197u,
5235 3592389776u, 3570296884u,
5236 2749873561u, 521432811u,
5237 987586766u, 3206261120u,
5238 1327840078u, 4078716491u,
5239 1753812954u, 976892272u,
5240 1827135136u, 1781944746u,
5241 1328622957u, 1015377974u,
5242 3439601008u, 2209584557u,
5243 2482286699u, 1109175923u,
5244 874877499u, 2036083451u,
5245 483570344u, 1091877599u,
5246 4190721328u, 1129462471u,
5247 640035849u, 1867372700u,
5248 920761165u, 3273688770u,
5249 1623777358u, 3389003793u,
5250 3241132743u, 2734783008u,
5251 696674661u, 2502161880u,
5252 1646071378u, 1164309901u,
5253 350411888u, 1978005963u,
5254 2253937037u, 7371540u,
5255 989577914u, 3626554867u,
5256 3214796883u, 531343826u,
5257 398899695u, 1145247203u,
5258 1516846461u, 3656006011u,
5259 529303412u, 3318455811u,
5260 3062828129u, 1696355359u,
5261 3698796465u, 3155218919u,
5262 1457595996u, 3191404246u,
5263 1395609912u, 2917345728u,
5264 1237411891u, 1854985978u,
5265 1091884675u, 3504488111u,
5266 3109924189u, 1628881950u,
5267 3939149151u, 878608872u,
5268 778235395u, 1052990614u,
5269 903730231u, 2069566979u,
5270 2437686324u, 3163786257u,
5271 2257884264u, 2123173186u,
5272 939764916u, 2933010098u,
5273 1235300371u, 1256485167u,
5274 1950274665u, 2180372319u,
5275 2648400302u, 122035049u,
5276 1883344352u, 2083771672u,
5277 3712110541u, 321199441u,
5278 1896357377u, 508560958u,
5279 3066325351u, 2770847216u,
5280 3177982504u, 296902736u,
5281 1486926688u, 456842861u,
5282 601221482u, 3992583643u,
5283 2794121515u, 1533934172u,
5284 1706465470u, 4281971893u,
5285 2557027816u, 900741486u,
5286 227175484u, 550595824u,
5287 690918144u, 2825943628u,
5288 90375300u, 300318232u,
5289 1985329734u, 1440763373u,
5290 3670603707u, 2533900859u,
5291 3253901179u, 542270815u,
5292 3677388841u, 307706478u,
5293 2570910669u, 3320103693u,
5294 1273768482u, 1216399252u,
5295 1652924805u, 1043647584u,
5296 1120323676u, 639941430u,
5297 325675502u, 3652676161u,
5298 4241680335u, 1545838362u,
5299 1991398008u, 4100211814u,
5300 1097584090u, 3262252593u,
5301 2254324292u, 1765019121u,
5302 4060211241u, 2315856188u,
5303 3704419305u, 411263051u,
5304 238929055u, 3540688404u,
5305 3094544537u, 3250435765u,
5306 3460621305u, 1967599860u,
5307 2016157366u, 847389916u,
5308 1659615591u, 4020453639u,
5309 901109753u, 2682611693u,
5310 1661364280u, 177155177u,
5311 3210561911u, 3802058181u,
5312 797089608u, 3286110054u,
5313 2110358240u, 1353279028u,
5314 2479975820u, 471725410u,
5315 2219863904u, 3623364733u,
5316 3167128228u, 1052188336u,
5317 3656587111u, 721788662u,
5318 3061255808u, 1615375832u,
5319 924941453u, 2547780700u,
5320 3328169224u, 1310964134u,
5321 2701956286u, 4145497671u,
5322 1421461094u, 1221397398u,
5323 1589183618u, 1492533854u,
5324 449740816u, 2686506989u,
5325 3035198924u, 1682886232u,
5326 2529760244u, 3342031659u,
5327 1235084019u, 2151665147u,
5328 2315686577u, 3282027660u,
5329 1140138691u, 2754346599u,
5330 2091754612u, 1178454681u,
5331 4226896579u, 2942520471u,
5332 2122168506u, 3751680858u,
5333 3213794286u, 2601416506u,
5334 4142747914u, 3951404257u,
5335 4243249649u, 748595836u,
5336 4004834921u, 238887261u,
5337 1927321047u, 2217148444u,
5338 205977665u, 1885975275u,
5339 186020771u, 2367569534u,
5340 2941662631u, 2608559272u,
5341 3342096731u, 741809437u,
5342 1962659444u, 3539886328u,
5343 3036596491u, 2282550094u,
5344 2366462727u, 2748286642u,
5345 2144472852u, 1390394371u,
5346 1257385924u, 2205425874u,
5347 2119055686u, 46865323u,
5348 3597555910u, 3188438773u,
5349 2372320753u, 3641116924u,
5350 3116286108u, 2680722658u,
5351 3371014971u, 2058751609u,
5352 2966943726u, 2345078707u,
5353 2330535244u, 4013841927u,
5354 1169588594u, 857915866u,
5355 1875260989u, 3175831309u,
5356 3193475664u, 1955181430u,
5357 923161569u, 4068653043u,
5358 776445899u, 954196929u,
5359 61509556u, 4248237857u,
5360 3808667664u, 581227317u,
5361 2893240187u, 4159497403u,
5362 4212264930u, 3973886195u,
5363 2077539039u, 851579036u,
5364 2957587591u, 772351886u,
5365 1173659554u, 946748363u,
5366 2794103714u, 2094375930u,
5367 4234750213u, 3671645488u,
5368 2614250782u, 2620465358u,
5369 3122317317u, 2365436865u,
5370 3393973390u, 523513960u,
5371 3645735309u, 2766686992u,
5372 2023960931u, 2312244996u,
5373 1875932218u, 3253711056u,
5374 3622416881u, 3274929205u,
5375 612094988u, 1555465129u,
5376 2114270406u, 3553762793u,
5377 1832633644u, 1087551556u,
5378 3306195841u, 1702313921u,
5379 3675066046u, 1735998785u,
5380 1690923980u, 1482649756u,
5381 1171351291u, 2043136409u,
5382 1962596992u, 461214626u,
5383 3278253346u, 1392428048u,
5384 3744621107u, 1028502697u,
5385 3991171462u, 1014064003u,
5386 3642345425u, 3186995039u,
5387 6114625u, 3359104346u,
5388 414856965u, 2814387514u,
5389 3583605071u, 2497896367u,
5390 1024572712u, 1927582962u,
5391 2892797583u, 845302635u,
5392 328548052u, 1523379748u,
5393 3392622118u, 1347167673u,
5394 1012316581u, 37767602u,
5395 2647726017u, 1070326065u,
5396 2075035198u, 4202817168u,
5397 2502924707u, 2612406822u,
5398 2187115553u, 1180137213u,
5399 701024148u, 1481965992u,
5400 3223787553u, 2083541843u,
5401 203230202u, 3876887380u,
5402 1334816273u, 2870251538u,
5403 2186205850u, 3985213979u,
5404 333533378u, 806507642u,
5405 1010064531u, 713520765u,
5406 3084131515u, 2637421459u,
5407 1703168933u, 1517562266u,
5408 4089081247u, 3231042924u,
5409 3079916123u, 3154574447u,
5410 2253948262u, 1725190035u,
5411 2452539325u, 1343734533u,
5412 213706059u, 2519409656u,
5413 108055211u, 2916327746u,
5414 587001593u, 1917607088u,
5415 4202913084u, 926304016u,
5416 469255411u, 4042080256u,
5417 3498936874u, 246692543u,
5418 495780578u, 438717281u,
5419 2259272650u, 4011324645u,
5420 2836854664u, 2317249321u,
5421 946828752u, 1280403658u,
5422 1905648354u, 2034241661u,
5423 774652981u, 1285694082u,
5424 2200307766u, 2158671727u,
5425 1135162148u, 232040752u,
5426 397012087u, 1717527689u,
5427 1720414106u, 918797022u,
5428 2580119304u, 3568069742u,
5429 2904461070u, 3893453420u,
5430 973817938u, 667499332u,
5431 3785870412u, 2088861715u,
5432 1565179401u, 600903026u,
5433 591806775u, 3512242245u,
5434 997964515u, 2339605347u,
5435 1134342772u, 3234226304u,
5436 4084179455u, 302315791u,
5437 2445626811u, 2590372496u,
5438 345572299u, 2274770442u,
5439 3600587867u, 3706939009u,
5440 1430507980u, 2656330434u,
5441 1079209397u, 2122849632u,
5442 1423705223u, 3826321888u,
5443 3683385276u, 1057038163u,
5444 1242840526u, 3987000643u,
5445 2398253089u, 1538190921u,
5446 1295898647u, 3570196893u,
5447 3065138774u, 3111336863u,
5448 2524949549u, 4203895425u,
5449 3025864372u, 968800353u,
5450 1023721001u, 3763083325u,
5451 526350786u, 635552097u,
5452 2308118370u, 2166472723u,
5453 2196937373u, 2643841788u,
5454 3040011470u, 4010301879u,
5455 2782379560u, 3474682856u,
5456 4201389782u, 4223278891u,
5457 1457302296u, 2251842132u,
5458 1090062008u, 3188219189u,
5459 292733931u, 1424229089u,
5460 1590782640u, 1365212370u,
5461 3975957073u, 3982969588u,
5462 2927147928u, 1048291071u,
5463 2766680094u, 884908196u,
5464 35237839u, 2221180633u,
5465 2490333812u, 4098360768u,
5466 4029081103u, 3490831871u,
5467 2392516272u, 3455379186u,
5468 3948800722u, 335456628u,
5469 2105117968u, 4181629008u,
5470 1044201772u, 3335754111u,
5471 540133451u, 3313113759u,
5472 3786107905u, 2627207327u,
5473 3540337875u, 3473113388u,
5474 3430536378u, 2514123129u,
5475 2124531276u, 3872633376u,
5476 3272957388u, 3501994650u,
5477 2418881542u, 487365389u,
5478 3877672368u, 1512866656u,
5479 3486531087u, 2102955203u,
5480 1136054817u, 3004241477u,
5481 1549075351u, 1302002008u,
5482 3936430045u, 2258587644u,
5483 4109233936u, 3679809321u,
5484 3467083076u, 2484463221u,
5485 1594979755u, 529218470u,
5486 3527024461u, 1147434678u,
5487 106799023u, 1823161970u,
5488 1704656738u, 1675883700u,
5489 3308746763u, 1875093248u,
5490 1352868568u, 1898561846u,
5491 2508994984u, 3177750780u,
5492 4217929592u, 400784472u,
5493 80090315u, 3564414786u,
5494 3841585648u, 3379293868u,
5495 160353261u, 2413172925u,
5496 2378499279u, 673436726u,
5497 1505702418u, 1330977363u,
5498 1853298225u, 3201741245u,
5499 2135714208u, 4069554166u,
5500 3715612384u, 3692488887u,
5501 3680311316u, 4274382900u,
5502 914186796u, 2264886523u,
5503 3869634032u, 1254199592u,
5504 1131020455u, 194781179u,
5505 429923922u, 2763792336u,
5506 2052895198u, 3997373194u,
5507 3440090658u, 2165746386u,
5508 1575500242u, 3463310191u,
5509 2064974716u, 3779513671u,
5510 3106421434u, 880320527u,
5511 3281914119u, 286569042u,
5512 3909096631u, 122359727u,
5513 1429837716u, 252230074u,
5514 4111461225u, 762273136u,
5515 93658514u, 2766407143u,
5516 3623657004u, 3869801679u,
5517 3925695921u, 2390397316u,
5518 2499025338u, 2741806539u,
5519 2507199021u, 1659221866u,
5520 361292116u, 4048761557u,
5521 3797133396u, 1517903247u,
5522 3121647246u, 3884308578u,
5523 1697201500u, 1558800262u,
5524 4150812360u, 3161302278u,
5525 2610217849u, 641564641u,
5526 183814518u, 2075245419u,
5527 611996508u, 2223461433u,
5528 329123979u, 121860586u,
5529 860985829u, 1137889144u,
5530 4018949439u, 2904348960u,
5531 947795261u, 1992594155u,
5532 4255427501u, 2281583851u,
5533 2892637604u, 1478186924u,
5534 3050771207u, 2767035539u,
5535 373510582u, 1963520320u,
5536 3763848370u, 3756817798u,
5537 627269409u, 1806905031u,
5538 1814444610u, 3646665053u,
5539 1822693920u, 278515794u,
5540 584050483u, 4142579188u,
5541 2149745808u, 3193071606u,
5542 1179706341u, 2693495182u,
5543 3259749808u, 644172091u,
5544 880509048u, 3340630542u,
5545 3365160815u, 2384445068u,
5546 3053081915u, 2840648309u,
5547 1986990122u, 1084703471u,
5548 2370410550u, 1627743573u,
5549 2244943480u, 4057483496u,
5550 2611595995u, 2470013639u,
5551 4024732359u, 3987190386u,
5552 873421687u, 2447660175u,
5553 3226583022u, 767655877u,
5554 2528024413u, 1962070688u,
5555 1233635843u, 2163464207u,
5556 659054446u, 854207134u,
5557 258410943u, 4197831420u,
5558 2515400215u, 3100476924u,
5559 1961549594u, 2219491151u,
5560 3997658851u, 163850514u,
5561 470325051u, 2598261204u,
5562 3052145580u, 59836528u,
5563 1376188597u, 966733415u,
5564 850667549u, 3622479237u,
5565 1083731990u, 1525777459u,
5566 4005126532u, 1428155540u,
5567 2781907007u, 943739431u,
5568 1493961005u, 2839096988u,
5569 2000057832u, 1941829603u,
5570 1901484772u, 939810041u,
5571 3377407371u, 3090115837u,
5572 3310840540u, 2068409688u,
5573 3261383939u, 2212130277u,
5574 2594774045u, 2912652418u,
5575 4179816101u, 3534504531u,
5576 3349254805u, 2796552902u,
5577 1385421283u, 4259908631u,
5578 3714780837u, 3070073945u,
5579 3372846298u, 3835884044u,
5580 3047965714u, 3009018735u,
5581 744091167u, 1861124263u,
5582 2764936304u, 1338171648u,
5583 4222019554u, 1395200692u,
5584 1371426007u, 3338031581u,
5585 2525665319u, 4196233786u,
5586 2332743921u, 1474702008u,
5587 2274266301u, 4255175517u,
5588 2290169528u, 1793910997u,
5589 2188254024u, 354202001u,
5590 3864458796u, 4280290498u,
5591 1554419340u, 1733094688u,
5592 2010552302u, 1561807039u,
5593 664313606u, 2548990879u,
5594 1084699349u, 3233936866u,
5595 973895284u, 2386881969u,
5596 1831995860u, 2961465052u,
5597 1428704144u, 3269904970u,
5598 231648253u, 2602483763u,
5599 4125013173u, 3319187387u,
5600 3347011944u, 1892898231u,
5601 4019114049u, 868879116u,
5602 4085937045u, 2378411019u,
5603 1072588531u, 3547435717u,
5604 2208070766u, 1069899078u,
5605 3142980597u, 2337088907u,
5606 1593338562u, 919414554u,
5607 688077849u, 3625708135u,
5608 1472447348u, 1947711896u,
5609 3953006207u, 877438080u,
5610 845995820u, 3150361443u,
5611 3053496713u, 2484577841u,
5612 224271045u, 2914958001u,
5613 2682612949u, 806655563u,
5614 2436224507u, 1907729235u,
5615 2920583824u, 1251814062u,
5616 2070814520u, 4034325578u,
5617 497847539u, 2714317144u,
5618 385182008u, 640855184u,
5619 1327075087u, 1062468773u,
5620 1757405994u, 1374270191u,
5621 4263183176u, 3041193150u,
5622 1037871524u, 3633173991u,
5623 4231821821u, 2830131945u,
5624 3505072908u, 2830570613u,
5625 4195208715u, 575398021u,
5626 3992840257u, 3691788221u,
5627 1949847968u, 2999344380u,
5628 3183782163u, 3723754342u,
5629 759716128u, 3284107364u,
5630 1714496583u, 15918244u,
5631 820509475u, 2553936299u,
5632 2201876606u, 4237151697u,
5633 2605688266u, 3253705097u,
5634 1008333207u, 712158730u,
5635 1722280252u, 1933868287u,
5636 4152736859u, 2097020806u,
5637 584426382u, 2836501956u,
5638 2522777566u, 1996172430u,
5639 2122199776u, 1069285218u,
5640 1474209360u, 690831894u,
5641 107482532u, 3695525410u,
5642 670591796u, 768977505u,
5643 2412057331u, 3647886687u,
5644 3110327607u, 1072658422u,
5645 379861934u, 1557579480u,
5646 4124127129u, 2271365865u,
5647 3880613089u, 739218494u,
5648 547346027u, 388559045u,
5649 3147335977u, 176230425u,
5650 3094853730u, 2554321205u,
5651 1495176194u, 4093461535u,
5652 3521297827u, 4108148413u,
5653 1913727929u, 1177947623u,
5654 1911655402u, 1053371241u,
5655 3265708874u, 1266515850u,
5656 1045540427u, 3194420196u,
5657 3717104621u, 1144474110u,
5658 1464392345u, 52070157u,
5659 4144237690u, 3350490823u,
5660 4166253320u, 2747410691u,
5661 };
5662
5663 // Return false only if offset is -1 and a spot check of 3 hashes all yield 0.
5664 bool Test(int offset, int len = 0) {
5665 #undef Check
5666 #undef IsAlive
5667
5668 #define Check(x) do { \
5669 const uint32_t actual = (x), e = expected[index++]; \
5670 bool ok = actual == e; \
5671 if (!ok) { \
5672 cerr << "expected " << hex << e << " but got " << actual << endl; \
5673 ++errors; \
5674 } \
5675 assert(ok); \
5676 } while (0)
5677
5678 #define IsAlive(x) do { alive += IsNonZero(x); } while (0)
5679
5680 // After the following line is where the uses of "Check" and such will go.
5681 static int index = 0;
5682 if (offset == -1) { int alive = 0; { uint64_t h = farmhashna::Hash64WithSeeds(da ta, len++, SEED0, SEED1); IsAlive(h >> 32); IsAlive((h << 32) >> 32); } { uint64 _t h = farmhashna::Hash64WithSeed(data, len++, SEED); IsAlive(h >> 32); IsAlive( (h << 32) >> 32); } { uint64_t h = farmhashna::Hash64(data, len++); IsAlive(h >> 32); IsAlive((h << 32) >> 32); } len -= 3; return alive > 0; }
5683 { uint64_t h = farmhashna::Hash64WithSeeds(data + offset, len, SEED0, SEED1); Ch eck(h >> 32); Check((h << 32) >> 32); }
5684 { uint64_t h = farmhashna::Hash64WithSeed(data + offset, len, SEED); Check(h >> 32); Check((h << 32) >> 32); }
5685 { uint64_t h = farmhashna::Hash64(data + offset, len); Check(h >> 32); Check((h << 32) >> 32); }
5686
5687 return true;
5688 #undef Check
5689 #undef IsAlive
5690 }
5691
5692 int RunTest() {
5693 Setup();
5694 int i = 0;
5695 cout << "Running farmhashnaTest";
5696 if (!Test(-1)) {
5697 cout << "... Unavailable\n";
5698 return NoteErrors();
5699 }
5700 // Good. The function is attempting to hash, so run the full test.
5701 int errors_prior_to_test = errors;
5702 for ( ; i < kTestSize - 1; i++) {
5703 Test(i * i, i);
5704 }
5705 for ( ; i < kDataSize; i += i / 7) {
5706 Test(0, i);
5707 }
5708 Test(0, kDataSize);
5709 cout << (errors == errors_prior_to_test ? "... OK\n" : "... Failed\n");
5710 return NoteErrors();
5711 }
5712
5713 #else
5714
5715 // After the following line is where the code to print hash codes will go.
5716 void Dump(int offset, int len) {
5717 { uint64_t h = farmhashna::Hash64WithSeeds(data + offset, len, SEED0, SEED1); co ut << (h >> 32) << "u, " << ((h << 32) >> 32) << "u," << endl; }
5718 { uint64_t h = farmhashna::Hash64WithSeed(data + offset, len, SEED); cout << (h >> 32) << "u, " << ((h << 32) >> 32) << "u," << endl; }
5719 { uint64_t h = farmhashna::Hash64(data + offset, len); cout << (h >> 32) << "u, " << ((h << 32) >> 32) << "u," << endl; }
5720 }
5721
5722 #endif
5723
5724 #undef SEED
5725 #undef SEED1
5726 #undef SEED0
5727
5728 } // namespace farmhashnaTest
5729
5730 #if TESTING
5731
5732 static int farmhashnaTestResult = farmhashnaTest::RunTest();
5733
5734 #else
5735 int main(int argc, char** argv) {
5736 Setup();
5737 cout << "uint32_t expected[] = {\n";
5738 int i = 0;
5739 for ( ; i < kTestSize - 1; i++) {
5740 farmhashnaTest::Dump(i * i, i);
5741 }
5742 for ( ; i < kDataSize; i += i / 7) {
5743 farmhashnaTest::Dump(0, i);
5744 }
5745 farmhashnaTest::Dump(0, kDataSize);
5746 cout << "};\n";
5747 }
5748 #endif
5749 #ifndef FARMHASH_SELF_TEST_GUARD
5750 #define FARMHASH_SELF_TEST_GUARD
5751 #include <cstdio>
5752 #include <iostream>
5753 #include <string.h>
5754
5755 using std::cout;
5756 using std::cerr;
5757 using std::endl;
5758 using std::hex;
5759
5760 static const uint64_t kSeed0 = 1234567;
5761 static const uint64_t kSeed1 = k0;
5762 static const int kDataSize = 1 << 20;
5763 static const int kTestSize = 300;
5764 #define kSeed128 Uint128(kSeed0, kSeed1)
5765
5766 static char data[kDataSize];
5767
5768 static int completed_self_tests = 0;
5769 static int errors = 0;
5770
5771 // Initialize data to pseudorandom values.
5772 void Setup() {
5773 if (completed_self_tests == 0) {
5774 uint64_t a = 9;
5775 uint64_t b = 777;
5776 for (int i = 0; i < kDataSize; i++) {
5777 a += b;
5778 b += a;
5779 a = (a ^ (a >> 41)) * k0;
5780 b = (b ^ (b >> 41)) * k0 + i;
5781 uint8_t u = b >> 37;
5782 memcpy(data + i, &u, 1); // uint8_t -> char
5783 }
5784 }
5785 }
5786
5787 int NoteErrors() {
5788 #define NUM_SELF_TESTS 9
5789 if (++completed_self_tests == NUM_SELF_TESTS)
5790 std::exit(errors > 0);
5791 return errors;
5792 }
5793
5794 template <typename T> inline bool IsNonZero(T x) {
5795 return x != 0;
5796 }
5797
5798 template <> inline bool IsNonZero<uint128_t>(uint128_t x) {
5799 return x != Uint128(0, 0);
5800 }
5801
5802 #endif // FARMHASH_SELF_TEST_GUARD
5803
5804 namespace farmhashntTest {
5805
5806 uint32_t CreateSeed(int offset, int salt) {
5807 uint32_t h = static_cast<uint32_t>(salt & 0xffffffff);
5808 h = h * c1;
5809 h ^= (h >> 17);
5810 h = h * c1;
5811 h ^= (h >> 17);
5812 h = h * c1;
5813 h ^= (h >> 17);
5814 h += static_cast<uint32_t>(offset & 0xffffffff);
5815 h = h * c1;
5816 h ^= (h >> 17);
5817 h = h * c1;
5818 h ^= (h >> 17);
5819 h = h * c1;
5820 h ^= (h >> 17);
5821 return h;
5822 }
5823
5824 #undef SEED
5825 #undef SEED1
5826 #undef SEED0
5827 #define SEED CreateSeed(offset, -1)
5828 #define SEED0 CreateSeed(offset, 0)
5829 #define SEED1 CreateSeed(offset, 1)
5830
5831 #undef TESTING
5832 #define TESTING 1
5833 #if TESTING
5834 uint32_t expected[] = {
5835 2681724312u,
5836 797982799u,
5837 921001710u,
5838 2134990486u,
5839 2244477846u,
5840 2992121793u,
5841 3943596029u,
5842 452431531u,
5843 2557197665u,
5844 2532580744u,
5845 3099673830u,
5846 3696623795u,
5847 3281581178u,
5848 1882212500u,
5849 275903667u,
5850 3033004529u,
5851 1402319660u,
5852 2699376854u,
5853 4222949502u,
5854 1712034059u,
5855 1330324210u,
5856 2921867846u,
5857 1728752234u,
5858 326029180u,
5859 3349570000u,
5860 1612122221u,
5861 1646032583u,
5862 1432476832u,
5863 3552092450u,
5864 1499109081u,
5865 1554038301u,
5866 3190844552u,
5867 540224401u,
5868 489963606u,
5869 1562872448u,
5870 2128624475u,
5871 1262831810u,
5872 1672724608u,
5873 2077310004u,
5874 1911523866u,
5875 294527927u,
5876 1389770549u,
5877 2026137563u,
5878 629449419u,
5879 2489287368u,
5880 645684964u,
5881 230403464u,
5882 3272648435u,
5883 165370827u,
5884 1230085527u,
5885 3628174014u,
5886 851743255u,
5887 1554380634u,
5888 3667013118u,
5889 2290487377u,
5890 1909203251u,
5891 1498556724u,
5892 4165088768u,
5893 197618179u,
5894 914413116u,
5895 1913303225u,
5896 3117299654u,
5897 1357272220u,
5898 507436733u,
5899 1413396341u,
5900 146044391u,
5901 429095991u,
5902 3056862311u,
5903 366414107u,
5904 2293458109u,
5905 1684583131u,
5906 1170404994u,
5907 520792961u,
5908 1577421232u,
5909 4033596884u,
5910 4229339322u,
5911 3242407770u,
5912 2649785113u,
5913 816692935u,
5914 3555213933u,
5915 517646945u,
5916 2180594090u,
5917 3047062993u,
5918 2391606125u,
5919 382936554u,
5920 788479970u,
5921 2826990641u,
5922 3167748333u,
5923 1758123094u,
5924 389974094u,
5925 3338548567u,
5926 2583576230u,
5927 3198590202u,
5928 4155628142u,
5929 542201663u,
5930 2856634168u,
5931 3948351189u,
5932 4194218315u,
5933 1467786451u,
5934 2743592929u,
5935 1062268187u,
5936 3810665822u,
5937 2560479831u,
5938 997658837u,
5939 3067277639u,
5940 1211737169u,
5941 59581167u,
5942 1389679610u,
5943 4189944477u,
5944 100876854u,
5945 2062343506u,
5946 3088828656u,
5947 3284356565u,
5948 3130054947u,
5949 3532596884u,
5950 3887208531u,
5951 259034107u,
5952 3233195759u,
5953 3200749877u,
5954 760633989u,
5955 1115203611u,
5956 1516407838u,
5957 1778459926u,
5958 2146672889u,
5959 2457048126u,
5960 2217471853u,
5961 862072556u,
5962 3745267835u,
5963 701920051u,
5964 581695350u,
5965 1410111809u,
5966 3326135446u,
5967 2187968410u,
5968 4267859263u,
5969 479241367u,
5970 2868987960u,
5971 704325635u,
5972 1418509533u,
5973 735688735u,
5974 3283299459u,
5975 813690332u,
5976 1439630796u,
5977 3195309868u,
5978 1616408198u,
5979 3254795114u,
5980 2799925823u,
5981 3929484338u,
5982 1798536177u,
5983 4205965408u,
5984 1499475160u,
5985 4247675634u,
5986 3779953975u,
5987 785893184u,
5988 2778575413u,
5989 1160134629u,
5990 823113169u,
5991 4116162021u,
5992 4167766971u,
5993 2487440590u,
5994 4004655503u,
5995 4044418876u,
5996 1462554406u,
5997 2011102035u,
5998 4265993528u,
5999 576405853u,
6000 4038839101u,
6001 2425317635u,
6002 1401013391u,
6003 3062418115u,
6004 3167030094u,
6005 2602636307u,
6006 4264167741u,
6007 4017058800u,
6008 1029665228u,
6009 4036354071u,
6010 2670703363u,
6011 688472265u,
6012 1054670286u,
6013 338058159u,
6014 1539305024u,
6015 146827036u,
6016 4060134777u,
6017 2502815838u,
6018 1603444633u,
6019 2448966429u,
6020 3891353218u,
6021 1082330589u,
6022 201837927u,
6023 2848283092u,
6024 883849006u,
6025 1982110346u,
6026 541496720u,
6027 133643215u,
6028 3847827123u,
6029 4015671361u,
6030 2849988118u,
6031 3452457457u,
6032 2102063419u,
6033 3281002516u,
6034 1539151988u,
6035 1147951686u,
6036 2005032160u,
6037 2415262714u,
6038 116647396u,
6039 1029284767u,
6040 2159170082u,
6041 1919171906u,
6042 2017579106u,
6043 2473524405u,
6044 1694443528u,
6045 3671562289u,
6046 505662155u,
6047 1019936943u,
6048 1511077569u,
6049 773792826u,
6050 2089123665u,
6051 484732447u,
6052 1120017626u,
6053 2809286837u,
6054 4029205195u,
6055 1097806406u,
6056 136118734u,
6057 4017075736u,
6058 1403506686u,
6059 1516736273u,
6060 2562064338u,
6061 2984955003u,
6062 3071338162u,
6063 1923531348u,
6064 771592405u,
6065 2586632018u,
6066 4032960199u,
6067 2687561076u,
6068 308584855u,
6069 1692079268u,
6070 2565680167u,
6071 3674576684u,
6072 3770488806u,
6073 69201295u,
6074 1255084262u,
6075 3593730713u,
6076 54945052u,
6077 1939595371u,
6078 2432427547u,
6079 2295501078u,
6080 1280920000u,
6081 82177963u,
6082 1121403845u,
6083 2889101923u,
6084 713121337u,
6085 1747052377u,
6086 927011680u,
6087 4142246789u,
6088 1958963937u,
6089 1636932722u,
6090 4075249328u,
6091 2025886508u,
6092 3026358429u,
6093 1845587644u,
6094 3615577014u,
6095 1363253259u,
6096 3087190425u,
6097 341851980u,
6098 2515339233u,
6099 1276595523u,
6100 460237542u,
6101 4198897105u,
6102 2069753399u,
6103 4278599955u,
6104 356742959u,
6105 3735275001u,
6106 1750561299u,
6107 668829411u,
6108 3384018814u,
6109 4233785523u,
6110 451656820u,
6111 107312677u,
6112 2390172694u,
6113 1216645846u,
6114 164402616u,
6115 1689811113u,
6116 1767810825u,
6117 1397772514u,
6118 3323383489u,
6119 2986430557u,
6120 207428029u,
6121 2260498180u,
6122 2360400900u,
6123 1263709570u,
6124 1377764574u,
6125 4252610345u,
6126 1099809675u,
6127 2776960536u,
6128 3542220540u,
6129 3752806924u,
6130 337070226u,
6131 3267551635u,
6132 1306761320u,
6133 2220373824u,
6134 4109252858u,
6135 896322512u,
6136 1788337208u,
6137 1336556841u,
6138 2911512007u,
6139 3712582785u,
6140 3071359622u,
6141 2561488770u,
6142 3898950547u,
6143 536047554u,
6144 2040551642u,
6145 3528794619u,
6146 3565689036u,
6147 1197100813u,
6148 1864569342u,
6149 3329594980u,
6150 490608221u,
6151 1174785921u,
6152 3287246572u,
6153 2163330264u,
6154 500120236u,
6155 2520062970u,
6156 1561519055u,
6157 4042710240u,
6158 2774151984u,
6159 3160666939u,
6160 96459446u,
6161 1878067032u,
6162 4237425634u,
6163 2952135524u,
6164 4100839753u,
6165 1265237690u,
6166 4246879223u,
6167 834830418u,
6168 3476334357u,
6169 4277111759u,
6170 2511026735u,
6171 3065234219u,
6172 556796152u,
6173 198182691u,
6174 2913077464u,
6175 1535115487u,
6176 4046477658u,
6177 140762681u,
6178 990407433u,
6179 2198985327u,
6180 2926590471u,
6181 559702706u,
6182 82077489u,
6183 1096697687u,
6184 4190838199u,
6185 3046872820u,
6186 1583801700u,
6187 2185339100u,
6188 3912423882u,
6189 3703603898u,
6190 2540185277u,
6191 1446869792u,
6192 4051584612u,
6193 2719373510u,
6194 1675560450u,
6195 1996164093u,
6196 405251683u,
6197 2864244470u,
6198 4071581802u,
6199 2028708916u,
6200 803575837u,
6201 557660441u,
6202 3841480082u,
6203 255451671u,
6204 779434428u,
6205 3452203069u,
6206 2285701422u,
6207 1568745354u,
6208 823305654u,
6209 3184047862u,
6210 4159715581u,
6211 3160134214u,
6212 3198900547u,
6213 1566527339u,
6214 4194096960u,
6215 1496132623u,
6216 1719108984u,
6217 2584236470u,
6218 531310503u,
6219 3456882941u,
6220 3382290593u,
6221 467441309u,
6222 3241407531u,
6223 2540270567u,
6224 1397502982u,
6225 3348545480u,
6226 811750340u,
6227 1017047954u,
6228 2540585554u,
6229 3531646869u,
6230 943914610u,
6231 1903578924u,
6232 1911188923u,
6233 241574049u,
6234 3181425568u,
6235 3529565564u,
6236 240953857u,
6237 2964595704u,
6238 3828377737u,
6239 4260564140u,
6240 4262383425u,
6241 383233885u,
6242 4051263539u,
6243 919677938u,
6244 1683612329u,
6245 4204155962u,
6246 2283918569u,
6247 4153726847u,
6248 350160869u,
6249 1387233546u,
6250 1891558063u,
6251 740563169u,
6252 330624974u,
6253 2948665536u,
6254 376390582u,
6255 3799363969u,
6256 3187805406u,
6257 2263421398u,
6258 1928519266u,
6259 2746577402u,
6260 2108753646u,
6261 768287270u,
6262 2247006571u,
6263 212490675u,
6264 917121602u,
6265 2549835613u,
6266 2864033668u,
6267 3738062408u,
6268 2006922227u,
6269 2616619070u,
6270 3449066284u,
6271 431292293u,
6272 786322314u,
6273 1415970351u,
6274 3263135197u,
6275 2954777083u,
6276 3206261120u,
6277 2287507921u,
6278 1781944746u,
6279 4081586725u,
6280 1109175923u,
6281 1813855658u,
6282 1129462471u,
6283 1037031473u,
6284 3389003793u,
6285 3122687303u,
6286 1164309901u,
6287 3193251135u,
6288 3626554867u,
6289 3071568023u,
6290 3656006011u,
6291 1167681812u,
6292 3155218919u,
6293 2704165015u,
6294 1854985978u,
6295 1712976649u,
6296 878608872u,
6297 4155949943u,
6298 3163786257u,
6299 1626463554u,
6300 1256485167u,
6301 582664250u,
6302 2083771672u,
6303 804336148u,
6304 2770847216u,
6305 1674051445u,
6306 3992583643u,
6307 2966108111u,
6308 900741486u,
6309 4014551783u,
6310 300318232u,
6311 3517585534u,
6312 542270815u,
6313 760762191u,
6314 1216399252u,
6315 643179562u,
6316 3652676161u,
6317 2990167340u,
6318 3262252593u,
6319 2134299399u,
6320 411263051u,
6321 1342880802u,
6322 1967599860u,
6323 853593042u,
6324 2682611693u,
6325 850464484u,
6326 3286110054u,
6327 3842907484u,
6328 3623364733u,
6329 3693536939u,
6330 1615375832u,
6331 2318423400u,
6332 4145497671u,
6333 1728968857u,
6334 2686506989u,
6335 1502282913u,
6336 2151665147u,
6337 3651607391u,
6338 1178454681u,
6339 4146839064u,
6340 2601416506u,
6341 1448097974u,
6342 238887261u,
6343 4093725287u,
6344 2367569534u,
6345 679517009u,
6346 3539886328u,
6347 3086277222u,
6348 1390394371u,
6349 119173722u,
6350 1766260771u,
6351 751439914u,
6352 215917713u,
6353 2656990891u,
6354 1570750352u,
6355 3533987737u,
6356 3576119563u,
6357 963183826u,
6358 3796810515u,
6359 136547246u,
6360 2592925324u,
6361 427154472u,
6362 1228758574u,
6363 1464255968u,
6364 2984611177u,
6365 2001585786u,
6366 1525438381u,
6367 1348536411u,
6368 2861338018u,
6369 764077711u,
6370 3785343245u,
6371 457568934u,
6372 4104954272u,
6373 2381948487u,
6374 3148473363u,
6375 2180270337u,
6376 1387729170u,
6377 951677556u,
6378 2721005055u,
6379 66786703u,
6380 1149351924u,
6381 1895026827u,
6382 3711056516u,
6383 3638638708u,
6384 2263003308u,
6385 3448840877u,
6386 225333538u,
6387 3797521928u,
6388 3262952567u,
6389 2078619498u,
6390 1178073973u,
6391 3288261538u,
6392 1496966875u,
6393 2481012988u,
6394 114945840u,
6395 1632780103u,
6396 2087949619u,
6397 3787017905u,
6398 2575395164u,
6399 2971726178u,
6400 3642087909u,
6401 3894199764u,
6402 203853421u,
6403 425935223u,
6404 3565833278u,
6405 1748785729u,
6406 580966986u,
6407 2124704694u,
6408 1107045577u,
6409 1067532701u,
6410 1406028344u,
6411 18613994u,
6412 3476683808u,
6413 3762914298u,
6414 1844996900u,
6415 904215228u,
6416 1118521573u,
6417 3657647605u,
6418 3136157065u,
6419 2287683323u,
6420 126005630u,
6421 3555092974u,
6422 49515858u,
6423 1010661841u,
6424 1902040126u,
6425 1400735275u,
6426 2771676666u,
6427 2225229957u,
6428 3454177594u,
6429 2883475137u,
6430 4144472319u,
6431 1051332394u,
6432 542648229u,
6433 1669710469u,
6434 553041029u,
6435 584127807u,
6436 2993670925u,
6437 3587959456u,
6438 1745399498u,
6439 1404723176u,
6440 1334333531u,
6441 3239516985u,
6442 1275954779u,
6443 367320647u,
6444 3684418197u,
6445 4030809053u,
6446 484559105u,
6447 4255931645u,
6448 4271715616u,
6449 3171911678u,
6450 928543347u,
6451 2159512867u,
6452 313902234u,
6453 647086234u,
6454 577214736u,
6455 1130129573u,
6456 995791646u,
6457 1645086060u,
6458 4122335794u,
6459 1064648931u,
6460 2752145076u,
6461 3312498873u,
6462 4238535494u,
6463 1471227427u,
6464 633688562u,
6465 1959779970u,
6466 766642813u,
6467 1380896111u,
6468 3647601207u,
6469 1733961041u,
6470 521947915u,
6471 189164145u,
6472 486382294u,
6473 3770038872u,
6474 3235740744u,
6475 1912506671u,
6476 2276864677u,
6477 1588060152u,
6478 2504457929u,
6479 1471020554u,
6480 3623212998u,
6481 3026631806u,
6482 2342164722u,
6483 1674890530u,
6484 3011542850u,
6485 3549160092u,
6486 4290680005u,
6487 3943068002u,
6488 2273781461u,
6489 2127663659u,
6490 1646681121u,
6491 447810651u,
6492 2366308558u,
6493 970504950u,
6494 2008155560u,
6495 2695940969u,
6496 3444688454u,
6497 1739318893u,
6498 2683090634u,
6499 2774816580u,
6500 437560100u,
6501 512012738u,
6502 3305170944u,
6503 665292744u,
6504 3580039116u,
6505 1579404983u,
6506 3397891494u,
6507 710590371u,
6508 2514565805u,
6509 3624609754u,
6510 3516075816u,
6511 1314000850u,
6512 1935166880u,
6513 3257747610u,
6514 3776931214u,
6515 3183054185u,
6516 675129307u,
6517 3333261712u,
6518 1154611403u,
6519 2759854023u,
6520 1963228038u,
6521 505138315u,
6522 1803966773u,
6523 4032705384u,
6524 798395739u,
6525 3473799845u,
6526 476400898u,
6527 602972493u,
6528 3289878097u,
6529 2520311409u,
6530 3214794876u,
6531 748160407u,
6532 1326769504u,
6533 902775872u,
6534 1372805534u,
6535 1213925114u,
6536 3009384989u,
6537 3781981134u,
6538 2835608783u,
6539 2716786748u,
6540 1669490957u,
6541 1089334066u,
6542 250756920u,
6543 4041016629u,
6544 2495807367u,
6545 2008251381u,
6546 106212622u,
6547 1927268995u,
6548 2251978818u,
6549 3788056262u,
6550 3678660147u,
6551 2656772270u,
6552 1997584981u,
6553 2668998785u,
6554 2954162084u,
6555 845687881u,
6556 776018378u,
6557 2066910012u,
6558 918315064u,
6559 };
6560
6561 // Return false only if offset is -1 and a spot check of 3 hashes all yield 0.
6562 bool Test(int offset, int len = 0) {
6563 #undef Check
6564 #undef IsAlive
6565
6566 #define Check(x) do { \
6567 const uint32_t actual = (x), e = expected[index++]; \
6568 bool ok = actual == e; \
6569 if (!ok) { \
6570 cerr << "expected " << hex << e << " but got " << actual << endl; \
6571 ++errors; \
6572 } \
6573 assert(ok); \
6574 } while (0)
6575
6576 #define IsAlive(x) do { alive += IsNonZero(x); } while (0)
6577
6578 // After the following line is where the uses of "Check" and such will go.
6579 static int index = 0;
6580 if (offset == -1) { int alive = 0; IsAlive(farmhashnt::Hash32WithSeed(data, len+ +, SEED)); IsAlive(farmhashnt::Hash32(data, len++)); IsAlive(farmhashnt::Hash32( data, len++)); len -= 3; return alive > 0; }
6581 Check(farmhashnt::Hash32WithSeed(data + offset, len, SEED));
6582 Check(farmhashnt::Hash32(data + offset, len));
6583
6584 return true;
6585 #undef Check
6586 #undef IsAlive
6587 }
6588
6589 int RunTest() {
6590 Setup();
6591 int i = 0;
6592 cout << "Running farmhashntTest";
6593 if (!Test(-1)) {
6594 cout << "... Unavailable\n";
6595 return NoteErrors();
6596 }
6597 // Good. The function is attempting to hash, so run the full test.
6598 int errors_prior_to_test = errors;
6599 for ( ; i < kTestSize - 1; i++) {
6600 Test(i * i, i);
6601 }
6602 for ( ; i < kDataSize; i += i / 7) {
6603 Test(0, i);
6604 }
6605 Test(0, kDataSize);
6606 cout << (errors == errors_prior_to_test ? "... OK\n" : "... Failed\n");
6607 return NoteErrors();
6608 }
6609
6610 #else
6611
6612 // After the following line is where the code to print hash codes will go.
6613 void Dump(int offset, int len) {
6614 cout << farmhashnt::Hash32WithSeed(data + offset, len, SEED) << "u," << endl;
6615 cout << farmhashnt::Hash32(data + offset, len) << "u," << endl;
6616 }
6617
6618 #endif
6619
6620 #undef SEED
6621 #undef SEED1
6622 #undef SEED0
6623
6624 } // namespace farmhashntTest
6625
6626 #if TESTING
6627
6628 static int farmhashntTestResult = farmhashntTest::RunTest();
6629
6630 #else
6631 int main(int argc, char** argv) {
6632 Setup();
6633 cout << "uint32_t expected[] = {\n";
6634 int i = 0;
6635 for ( ; i < kTestSize - 1; i++) {
6636 farmhashntTest::Dump(i * i, i);
6637 }
6638 for ( ; i < kDataSize; i += i / 7) {
6639 farmhashntTest::Dump(0, i);
6640 }
6641 farmhashntTest::Dump(0, kDataSize);
6642 cout << "};\n";
6643 }
6644 #endif
6645 #ifndef FARMHASH_SELF_TEST_GUARD
6646 #define FARMHASH_SELF_TEST_GUARD
6647 #include <cstdio>
6648 #include <iostream>
6649 #include <string.h>
6650
6651 using std::cout;
6652 using std::cerr;
6653 using std::endl;
6654 using std::hex;
6655
6656 static const uint64_t kSeed0 = 1234567;
6657 static const uint64_t kSeed1 = k0;
6658 static const int kDataSize = 1 << 20;
6659 static const int kTestSize = 300;
6660 #define kSeed128 Uint128(kSeed0, kSeed1)
6661
6662 static char data[kDataSize];
6663
6664 static int completed_self_tests = 0;
6665 static int errors = 0;
6666
6667 // Initialize data to pseudorandom values.
6668 void Setup() {
6669 if (completed_self_tests == 0) {
6670 uint64_t a = 9;
6671 uint64_t b = 777;
6672 for (int i = 0; i < kDataSize; i++) {
6673 a += b;
6674 b += a;
6675 a = (a ^ (a >> 41)) * k0;
6676 b = (b ^ (b >> 41)) * k0 + i;
6677 uint8_t u = b >> 37;
6678 memcpy(data + i, &u, 1); // uint8_t -> char
6679 }
6680 }
6681 }
6682
6683 int NoteErrors() {
6684 #define NUM_SELF_TESTS 9
6685 if (++completed_self_tests == NUM_SELF_TESTS)
6686 std::exit(errors > 0);
6687 return errors;
6688 }
6689
6690 template <typename T> inline bool IsNonZero(T x) {
6691 return x != 0;
6692 }
6693
6694 template <> inline bool IsNonZero<uint128_t>(uint128_t x) {
6695 return x != Uint128(0, 0);
6696 }
6697
6698 #endif // FARMHASH_SELF_TEST_GUARD
6699
6700 namespace farmhashsaTest {
6701
6702 uint32_t CreateSeed(int offset, int salt) {
6703 uint32_t h = static_cast<uint32_t>(salt & 0xffffffff);
6704 h = h * c1;
6705 h ^= (h >> 17);
6706 h = h * c1;
6707 h ^= (h >> 17);
6708 h = h * c1;
6709 h ^= (h >> 17);
6710 h += static_cast<uint32_t>(offset & 0xffffffff);
6711 h = h * c1;
6712 h ^= (h >> 17);
6713 h = h * c1;
6714 h ^= (h >> 17);
6715 h = h * c1;
6716 h ^= (h >> 17);
6717 return h;
6718 }
6719
6720 #undef SEED
6721 #undef SEED1
6722 #undef SEED0
6723 #define SEED CreateSeed(offset, -1)
6724 #define SEED0 CreateSeed(offset, 0)
6725 #define SEED1 CreateSeed(offset, 1)
6726
6727 #undef TESTING
6728 #define TESTING 1
6729 #if TESTING
6730 uint32_t expected[] = {
6731 4223616069u,
6732 3696677242u,
6733 4081014168u,
6734 2576519988u,
6735 2212771159u,
6736 1112731063u,
6737 1020067935u,
6738 3955445564u,
6739 1451961420u,
6740 653440099u,
6741 31917516u,
6742 2957164615u,
6743 2590087362u,
6744 3879448744u,
6745 176305566u,
6746 2447367541u,
6747 1359016305u,
6748 3363804638u,
6749 1117290165u,
6750 1062549743u,
6751 2437877004u,
6752 1894455839u,
6753 673206794u,
6754 3486923651u,
6755 3269862919u,
6756 2303349487u,
6757 1380660650u,
6758 595525107u,
6759 1525325287u,
6760 2025609358u,
6761 176408838u,
6762 1592885012u,
6763 864896482u,
6764 2101378090u,
6765 3489229104u,
6766 2118965695u,
6767 581644891u,
6768 2718789079u,
6769 631613207u,
6770 4228658372u,
6771 3867875546u,
6772 3531368319u,
6773 3804516756u,
6774 3317755099u,
6775 1619744564u,
6776 2884717286u,
6777 1088213445u,
6778 2667691076u,
6779 3727873235u,
6780 2330406762u,
6781 858590707u,
6782 123802208u,
6783 4150036245u,
6784 182283099u,
6785 1478882570u,
6786 3282617403u,
6787 819171187u,
6788 1172627392u,
6789 4254302102u,
6790 2957028020u,
6791 437030323u,
6792 2452147680u,
6793 2868246750u,
6794 3530169402u,
6795 3154852132u,
6796 215019192u,
6797 357580983u,
6798 1354454461u,
6799 1108813287u,
6800 2324008118u,
6801 2315997713u,
6802 4181601562u,
6803 1360882441u,
6804 92423273u,
6805 3048866755u,
6806 3369188505u,
6807 3664371439u,
6808 2920710428u,
6809 1027891570u,
6810 2653166430u,
6811 3461888315u,
6812 1475780447u,
6813 292769636u,
6814 1737473313u,
6815 4064110516u,
6816 4170160075u,
6817 762850927u,
6818 3630603695u,
6819 2803307356u,
6820 844987665u,
6821 460980967u,
6822 3005635467u,
6823 2802568977u,
6824 588668033u,
6825 2148940781u,
6826 3239099984u,
6827 1266953698u,
6828 3197808789u,
6829 3519942533u,
6830 2511995334u,
6831 2553810188u,
6832 871667697u,
6833 1358675720u,
6834 1499319171u,
6835 2044931270u,
6836 1210355103u,
6837 807152540u,
6838 3262320756u,
6839 2810214575u,
6840 1813386141u,
6841 4089465863u,
6842 903928165u,
6843 1388899322u,
6844 3209183659u,
6845 834536144u,
6846 2733354550u,
6847 2742289921u,
6848 3689042563u,
6849 2655593281u,
6850 4169686303u,
6851 415985561u,
6852 138892376u,
6853 516115393u,
6854 65683883u,
6855 4162865100u,
6856 889944635u,
6857 313566528u,
6858 3346420907u,
6859 1504303591u,
6860 2256809275u,
6861 742243229u,
6862 779775302u,
6863 3140940172u,
6864 2312556111u,
6865 2304095772u,
6866 1151741606u,
6867 2194712422u,
6868 1714084652u,
6869 3272736835u,
6870 1311540658u,
6871 191179665u,
6872 3996605106u,
6873 1657345233u,
6874 4205442903u,
6875 1553339212u,
6876 2351843044u,
6877 1647502006u,
6878 2525516233u,
6879 292202846u,
6880 1498646290u,
6881 1429323381u,
6882 974274898u,
6883 3759331561u,
6884 2881238887u,
6885 826787221u,
6886 1069622448u,
6887 221991032u,
6888 1462969082u,
6889 2799661508u,
6890 364022781u,
6891 2594244377u,
6892 797773898u,
6893 4097839290u,
6894 1529150125u,
6895 2456805570u,
6896 541503425u,
6897 3936326142u,
6898 3112719954u,
6899 775223581u,
6900 3074018423u,
6901 3198488875u,
6902 1772191849u,
6903 2456535211u,
6904 3154686028u,
6905 1520862019u,
6906 4005829426u,
6907 1306433767u,
6908 1943028506u,
6909 2246000782u,
6910 1057766454u,
6911 3761996982u,
6912 3441075333u,
6913 898641979u,
6914 3450209088u,
6915 3941329307u,
6916 3289922449u,
6917 3085075827u,
6918 1814193220u,
6919 690422997u,
6920 2627846676u,
6921 2653520704u,
6922 3739145533u,
6923 3996776010u,
6924 2287072592u,
6925 1346671698u,
6926 3082629900u,
6927 2298811274u,
6928 3639722036u,
6929 1729419228u,
6930 1836765953u,
6931 3708118742u,
6932 213436u,
6933 950223749u,
6934 3734247682u,
6935 2924575678u,
6936 1382024841u,
6937 2431637732u,
6938 3448846682u,
6939 1341301397u,
6940 4206956590u,
6941 1730650902u,
6942 2581075456u,
6943 1542359141u,
6944 707222542u,
6945 2925350541u,
6946 3846303536u,
6947 3579103295u,
6948 3932175763u,
6949 1339615732u,
6950 848825750u,
6951 1070170828u,
6952 1964973818u,
6953 577060344u,
6954 607721296u,
6955 4031023048u,
6956 406883794u,
6957 3991905552u,
6958 1198544082u,
6959 872468460u,
6960 1044847096u,
6961 3159976313u,
6962 3020028266u,
6963 2108700400u,
6964 3373767922u,
6965 264431841u,
6966 2817097007u,
6967 3700061048u,
6968 1733731531u,
6969 3459415893u,
6970 80378591u,
6971 1479875104u,
6972 19735612u,
6973 1382658977u,
6974 3416562245u,
6975 1959852842u,
6976 2384002344u,
6977 124683828u,
6978 3725782174u,
6979 2300301222u,
6980 393852269u,
6981 1302492002u,
6982 3623776492u,
6983 3787086417u,
6984 1730024749u,
6985 1710531361u,
6986 443700716u,
6987 1461987482u,
6988 671998131u,
6989 3018380746u,
6990 2592292305u,
6991 3390799372u,
6992 3945101155u,
6993 3743494852u,
6994 3716045582u,
6995 996005166u,
6996 320698449u,
6997 3420221765u,
6998 1518157951u,
6999 2555810666u,
7000 3381929684u,
7001 2019638523u,
7002 3088262796u,
7003 2072178906u,
7004 3433649364u,
7005 203906916u,
7006 34663784u,
7007 290301305u,
7008 1188021504u,
7009 3754681145u,
7010 3920313139u,
7011 2840496520u,
7012 1656802962u,
7013 2288475489u,
7014 3399185138u,
7015 1296000826u,
7016 2362384746u,
7017 309633360u,
7018 2719851778u,
7019 776035930u,
7020 3200733043u,
7021 365690832u,
7022 3326378243u,
7023 1500331457u,
7024 1625708592u,
7025 4230903462u,
7026 715344888u,
7027 3363777768u,
7028 2243620288u,
7029 2890765789u,
7030 553154234u,
7031 4044100108u,
7032 4056887320u,
7033 1185656496u,
7034 3671476744u,
7035 1064586897u,
7036 1154949698u,
7037 3493481974u,
7038 1294573722u,
7039 1869224012u,
7040 2530084956u,
7041 995321553u,
7042 833419249u,
7043 563815282u,
7044 250258043u,
7045 2970801822u,
7046 441007535u,
7047 42246961u,
7048 2820426655u,
7049 2878882436u,
7050 2363245780u,
7051 2138489282u,
7052 2972360481u,
7053 2312619393u,
7054 3598664848u,
7055 3071556076u,
7056 776990325u,
7057 3220427357u,
7058 2257939577u,
7059 3817305903u,
7060 1502979698u,
7061 3159755934u,
7062 3955997276u,
7063 2423850008u,
7064 1959927572u,
7065 1219782288u,
7066 4119776679u,
7067 1124253854u,
7068 3678052422u,
7069 2620644947u,
7070 1262408666u,
7071 3480072280u,
7072 2627137665u,
7073 807538749u,
7074 3276646337u,
7075 518510128u,
7076 1137828655u,
7077 1498449110u,
7078 3031692317u,
7079 1125635969u,
7080 1130096111u,
7081 780007336u,
7082 3111856399u,
7083 1014917264u,
7084 780877352u,
7085 2909458336u,
7086 4235949214u,
7087 2423879289u,
7088 275888892u,
7089 3891926795u,
7090 3538163953u,
7091 54815161u,
7092 162228302u,
7093 258154068u,
7094 3554455591u,
7095 1801469029u,
7096 2801563220u,
7097 726560058u,
7098 2450221940u,
7099 3677582978u,
7100 440993800u,
7101 424762443u,
7102 2624525253u,
7103 2587715329u,
7104 2292264424u,
7105 1074856749u,
7106 3294752007u,
7107 3164112672u,
7108 2399146799u,
7109 1920182465u,
7110 3858835361u,
7111 193755240u,
7112 3333610311u,
7113 1757504059u,
7114 2576027039u,
7115 2775253365u,
7116 2939191561u,
7117 1046147275u,
7118 235149906u,
7119 4262218222u,
7120 2900542726u,
7121 2260154702u,
7122 1019551635u,
7123 1194720570u,
7124 3519118691u,
7125 3039483153u,
7126 84918216u,
7127 3053381097u,
7128 2572396843u,
7129 3849763371u,
7130 2782686780u,
7131 3710049554u,
7132 3403430713u,
7133 2346080784u,
7134 2496307442u,
7135 1597281872u,
7136 696018239u,
7137 704625714u,
7138 623026921u,
7139 3182413559u,
7140 3794540330u,
7141 305497722u,
7142 1592680199u,
7143 2377854072u,
7144 3060601746u,
7145 3953057908u,
7146 3941551588u,
7147 1033716182u,
7148 2765716854u,
7149 1309699058u,
7150 3519400181u,
7151 3073370877u,
7152 115583008u,
7153 4032909296u,
7154 2944563574u,
7155 3762753718u,
7156 192842727u,
7157 1711348701u,
7158 3086147235u,
7159 1658229443u,
7160 1479783872u,
7161 3839977157u,
7162 225619117u,
7163 1349684817u,
7164 1964813173u,
7165 565753187u,
7166 2530252046u,
7167 840014353u,
7168 1645183704u,
7169 3668429078u,
7170 3438418557u,
7171 639704059u,
7172 360837811u,
7173 2531807958u,
7174 1572353913u,
7175 2116037299u,
7176 1948437512u,
7177 744553393u,
7178 2380697034u,
7179 3775234105u,
7180 3816065157u,
7181 301868653u,
7182 2960939561u,
7183 3306528247u,
7184 2389296549u,
7185 805918610u,
7186 1759358265u,
7187 1760876328u,
7188 2827601706u,
7189 2944594708u,
7190 3313666458u,
7191 2022601495u,
7192 730938791u,
7193 193539397u,
7194 2026103244u,
7195 802928398u,
7196 2630934308u,
7197 782805818u,
7198 3499326016u,
7199 293509489u,
7200 3646131514u,
7201 3182478647u,
7202 854800333u,
7203 2284531628u,
7204 438528022u,
7205 2339298129u,
7206 1692289216u,
7207 2427728723u,
7208 46501288u,
7209 350652353u,
7210 1355971222u,
7211 889682372u,
7212 944799254u,
7213 2763906061u,
7214 2807550612u,
7215 2683762637u,
7216 100870317u,
7217 2449357318u,
7218 2638348436u,
7219 4206088869u,
7220 1788948473u,
7221 3537588549u,
7222 2782490204u,
7223 134406470u,
7224 2409190528u,
7225 2362439849u,
7226 1861661528u,
7227 2101513194u,
7228 1424834765u,
7229 3581765745u,
7230 3185999525u,
7231 2057487100u,
7232 2303941176u,
7233 3639628788u,
7234 1180265315u,
7235 230437935u,
7236 2108319366u,
7237 1131685143u,
7238 1055685292u,
7239 1509007009u,
7240 1258485140u,
7241 560525005u,
7242 3598799040u,
7243 3835680585u,
7244 1851859628u,
7245 332858996u,
7246 641769248u,
7247 4252450037u,
7248 865386707u,
7249 720719117u,
7250 3133612164u,
7251 3833045874u,
7252 3492515435u,
7253 2465970289u,
7254 4234420011u,
7255 573859916u,
7256 252532886u,
7257 870392318u,
7258 4051320920u,
7259 894929092u,
7260 3748361688u,
7261 699355960u,
7262 1885212350u,
7263 1609756949u,
7264 461896870u,
7265 1337065461u,
7266 1775211059u,
7267 1786193749u,
7268 2815154643u,
7269 2128729882u,
7270 969639529u,
7271 3960427545u,
7272 859416958u,
7273 2739758802u,
7274 2698032197u,
7275 2813292418u,
7276 1985467524u,
7277 396604317u,
7278 4122172759u,
7279 1201259789u,
7280 4282051702u,
7281 3270018895u,
7282 961215209u,
7283 961075860u,
7284 4211926998u,
7285 4088374597u,
7286 577510509u,
7287 3058349487u,
7288 4025377754u,
7289 2815478438u,
7290 471023164u,
7291 3947959608u,
7292 4161486934u,
7293 2299888461u,
7294 1103571511u,
7295 2450153872u,
7296 1839939275u,
7297 108299608u,
7298 858086440u,
7299 1030152945u,
7300 3895328530u,
7301 3009080718u,
7302 3690840454u,
7303 3847025277u,
7304 152331362u,
7305 161365689u,
7306 831319961u,
7307 2166017294u,
7308 3945322722u,
7309 4059970216u,
7310 1420824131u,
7311 2770648308u,
7312 1567250186u,
7313 2181067149u,
7314 1939743488u,
7315 3080158120u,
7316 3435218248u,
7317 2495237495u,
7318 3814085102u,
7319 3180983013u,
7320 3199054292u,
7321 2204745908u,
7322 1140337267u,
7323 2213569784u,
7324 1941879842u,
7325 2105562605u,
7326 3618835614u,
7327 2247103645u,
7328 2492473487u,
7329 856414299u,
7330 166022030u,
7331 4080104712u,
7332 3218935344u,
7333 3284220561u,
7334 4261581452u,
7335 1206944836u,
7336 3496705432u,
7337 2215996876u,
7338 3154627465u,
7339 3384005496u,
7340 742170556u,
7341 1333047620u,
7342 802680366u,
7343 156833431u,
7344 2682100354u,
7345 2493654830u,
7346 584848366u,
7347 1691693131u,
7348 2169934170u,
7349 779968026u,
7350 2099545800u,
7351 1423039695u,
7352 4292110968u,
7353 4266576788u,
7354 149142597u,
7355 748501873u,
7356 3865014822u,
7357 1913588198u,
7358 130285614u,
7359 3500768879u,
7360 915458923u,
7361 3071792750u,
7362 1339986633u,
7363 4143929149u,
7364 4048379479u,
7365 725193827u,
7366 1375113643u,
7367 2425277412u,
7368 4144659274u,
7369 465714768u,
7370 226991589u,
7371 2212127704u,
7372 3936145258u,
7373 2891024846u,
7374 3816000225u,
7375 979331165u,
7376 1749907536u,
7377 53847318u,
7378 1462525833u,
7379 2961425455u,
7380 368859113u,
7381 3572721452u,
7382 453048644u,
7383 1628629918u,
7384 3497673923u,
7385 3619079585u,
7386 139870565u,
7387 1518176798u,
7388 3933074281u,
7389 1878623729u,
7390 2074035641u,
7391 3016759257u,
7392 1313053591u,
7393 2557706970u,
7394 2348296582u,
7395 962370022u,
7396 2337285014u,
7397 1618936717u,
7398 1915877085u,
7399 2743743122u,
7400 3250783882u,
7401 1346652536u,
7402 143311109u,
7403 2443788461u,
7404 1048248964u,
7405 2806619339u,
7406 3263266976u,
7407 1668146349u,
7408 3397428868u,
7409 3276188862u,
7410 1774196343u,
7411 1993847813u,
7412 2771079610u,
7413 476672419u,
7414 2119050359u,
7415 2918326659u,
7416 2245402721u,
7417 2692910474u,
7418 2374383269u,
7419 342400227u,
7420 2961437795u,
7421 3899230368u,
7422 337787132u,
7423 3664444935u,
7424 1269451153u,
7425 2971526729u,
7426 1486511182u,
7427 791070133u,
7428 2570319890u,
7429 3482497490u,
7430 2134230518u,
7431 4273391202u,
7432 1825511330u,
7433 3947753714u,
7434 1389755724u,
7435 3995075516u,
7436 2081052615u,
7437 3626343470u,
7438 4213603435u,
7439 2137917278u,
7440 2898987303u,
7441 3059215715u,
7442 3383237881u,
7443 3003674434u,
7444 409174425u,
7445 1911915604u,
7446 2087728055u,
7447 2942005882u,
7448 3386522440u,
7449 714936074u,
7450 261924004u,
7451 3268784033u,
7452 1141188757u,
7453 2413217552u,
7454 1515163433u,
7455 };
7456
7457 // Return false only if offset is -1 and a spot check of 3 hashes all yield 0.
7458 bool Test(int offset, int len = 0) {
7459 #undef Check
7460 #undef IsAlive
7461
7462 #define Check(x) do { \
7463 const uint32_t actual = (x), e = expected[index++]; \
7464 bool ok = actual == e; \
7465 if (!ok) { \
7466 cerr << "expected " << hex << e << " but got " << actual << endl; \
7467 ++errors; \
7468 } \
7469 assert(ok); \
7470 } while (0)
7471
7472 #define IsAlive(x) do { alive += IsNonZero(x); } while (0)
7473
7474 // After the following line is where the uses of "Check" and such will go.
7475 static int index = 0;
7476 if (offset == -1) { int alive = 0; IsAlive(farmhashsa::Hash32WithSeed(data, len+ +, SEED)); IsAlive(farmhashsa::Hash32(data, len++)); IsAlive(farmhashsa::Hash32( data, len++)); len -= 3; return alive > 0; }
7477 Check(farmhashsa::Hash32WithSeed(data + offset, len, SEED));
7478 Check(farmhashsa::Hash32(data + offset, len));
7479
7480 return true;
7481 #undef Check
7482 #undef IsAlive
7483 }
7484
7485 int RunTest() {
7486 Setup();
7487 int i = 0;
7488 cout << "Running farmhashsaTest";
7489 if (!Test(-1)) {
7490 cout << "... Unavailable\n";
7491 return NoteErrors();
7492 }
7493 // Good. The function is attempting to hash, so run the full test.
7494 int errors_prior_to_test = errors;
7495 for ( ; i < kTestSize - 1; i++) {
7496 Test(i * i, i);
7497 }
7498 for ( ; i < kDataSize; i += i / 7) {
7499 Test(0, i);
7500 }
7501 Test(0, kDataSize);
7502 cout << (errors == errors_prior_to_test ? "... OK\n" : "... Failed\n");
7503 return NoteErrors();
7504 }
7505
7506 #else
7507
7508 // After the following line is where the code to print hash codes will go.
7509 void Dump(int offset, int len) {
7510 cout << farmhashsa::Hash32WithSeed(data + offset, len, SEED) << "u," << endl;
7511 cout << farmhashsa::Hash32(data + offset, len) << "u," << endl;
7512 }
7513
7514 #endif
7515
7516 #undef SEED
7517 #undef SEED1
7518 #undef SEED0
7519
7520 } // namespace farmhashsaTest
7521
7522 #if TESTING
7523
7524 static int farmhashsaTestResult = farmhashsaTest::RunTest();
7525
7526 #else
7527 int main(int argc, char** argv) {
7528 Setup();
7529 cout << "uint32_t expected[] = {\n";
7530 int i = 0;
7531 for ( ; i < kTestSize - 1; i++) {
7532 farmhashsaTest::Dump(i * i, i);
7533 }
7534 for ( ; i < kDataSize; i += i / 7) {
7535 farmhashsaTest::Dump(0, i);
7536 }
7537 farmhashsaTest::Dump(0, kDataSize);
7538 cout << "};\n";
7539 }
7540 #endif
7541 #ifndef FARMHASH_SELF_TEST_GUARD
7542 #define FARMHASH_SELF_TEST_GUARD
7543 #include <cstdio>
7544 #include <iostream>
7545 #include <string.h>
7546
7547 using std::cout;
7548 using std::cerr;
7549 using std::endl;
7550 using std::hex;
7551
7552 static const uint64_t kSeed0 = 1234567;
7553 static const uint64_t kSeed1 = k0;
7554 static const int kDataSize = 1 << 20;
7555 static const int kTestSize = 300;
7556 #define kSeed128 Uint128(kSeed0, kSeed1)
7557
7558 static char data[kDataSize];
7559
7560 static int completed_self_tests = 0;
7561 static int errors = 0;
7562
7563 // Initialize data to pseudorandom values.
7564 void Setup() {
7565 if (completed_self_tests == 0) {
7566 uint64_t a = 9;
7567 uint64_t b = 777;
7568 for (int i = 0; i < kDataSize; i++) {
7569 a += b;
7570 b += a;
7571 a = (a ^ (a >> 41)) * k0;
7572 b = (b ^ (b >> 41)) * k0 + i;
7573 uint8_t u = b >> 37;
7574 memcpy(data + i, &u, 1); // uint8_t -> char
7575 }
7576 }
7577 }
7578
7579 int NoteErrors() {
7580 #define NUM_SELF_TESTS 9
7581 if (++completed_self_tests == NUM_SELF_TESTS)
7582 std::exit(errors > 0);
7583 return errors;
7584 }
7585
7586 template <typename T> inline bool IsNonZero(T x) {
7587 return x != 0;
7588 }
7589
7590 template <> inline bool IsNonZero<uint128_t>(uint128_t x) {
7591 return x != Uint128(0, 0);
7592 }
7593
7594 #endif // FARMHASH_SELF_TEST_GUARD
7595
7596 namespace farmhashsuTest {
7597
7598 uint32_t CreateSeed(int offset, int salt) {
7599 uint32_t h = static_cast<uint32_t>(salt & 0xffffffff);
7600 h = h * c1;
7601 h ^= (h >> 17);
7602 h = h * c1;
7603 h ^= (h >> 17);
7604 h = h * c1;
7605 h ^= (h >> 17);
7606 h += static_cast<uint32_t>(offset & 0xffffffff);
7607 h = h * c1;
7608 h ^= (h >> 17);
7609 h = h * c1;
7610 h ^= (h >> 17);
7611 h = h * c1;
7612 h ^= (h >> 17);
7613 return h;
7614 }
7615
7616 #undef SEED
7617 #undef SEED1
7618 #undef SEED0
7619 #define SEED CreateSeed(offset, -1)
7620 #define SEED0 CreateSeed(offset, 0)
7621 #define SEED1 CreateSeed(offset, 1)
7622
7623 #undef TESTING
7624 #define TESTING 1
7625 #if TESTING
7626 uint32_t expected[] = {
7627 4223616069u,
7628 3696677242u,
7629 4081014168u,
7630 2576519988u,
7631 2212771159u,
7632 1112731063u,
7633 1020067935u,
7634 3955445564u,
7635 1451961420u,
7636 653440099u,
7637 31917516u,
7638 2957164615u,
7639 2590087362u,
7640 3879448744u,
7641 176305566u,
7642 2447367541u,
7643 1359016305u,
7644 3363804638u,
7645 1117290165u,
7646 1062549743u,
7647 2437877004u,
7648 1894455839u,
7649 673206794u,
7650 3486923651u,
7651 3269862919u,
7652 2303349487u,
7653 1380660650u,
7654 595525107u,
7655 1525325287u,
7656 2025609358u,
7657 176408838u,
7658 1592885012u,
7659 864896482u,
7660 2101378090u,
7661 3489229104u,
7662 2118965695u,
7663 581644891u,
7664 2718789079u,
7665 631613207u,
7666 4228658372u,
7667 3867875546u,
7668 3531368319u,
7669 3804516756u,
7670 3317755099u,
7671 1619744564u,
7672 2884717286u,
7673 1088213445u,
7674 2667691076u,
7675 3727873235u,
7676 2330406762u,
7677 858590707u,
7678 457744844u,
7679 4150036245u,
7680 2000404290u,
7681 1478882570u,
7682 901678172u,
7683 819171187u,
7684 195942998u,
7685 4254302102u,
7686 3967266927u,
7687 437030323u,
7688 4018009204u,
7689 2868246750u,
7690 3540087514u,
7691 3154852132u,
7692 3319116625u,
7693 357580983u,
7694 3177665294u,
7695 1108813287u,
7696 1253366798u,
7697 2315997713u,
7698 510718750u,
7699 1360882441u,
7700 2770216279u,
7701 3048866755u,
7702 3406961221u,
7703 3664371439u,
7704 1151145514u,
7705 1027891570u,
7706 2699067992u,
7707 3461888315u,
7708 198061905u,
7709 292769636u,
7710 1106771795u,
7711 4064110516u,
7712 3258279756u,
7713 762850927u,
7714 1818699721u,
7715 2803307356u,
7716 3919169404u,
7717 460980967u,
7718 3125535078u,
7719 2802568977u,
7720 3582546426u,
7721 2148940781u,
7722 3963274378u,
7723 1266953698u,
7724 204185123u,
7725 1100034381u,
7726 3009193601u,
7727 4200651967u,
7728 274889605u,
7729 2700589508u,
7730 952511689u,
7731 3765324859u,
7732 3465498478u,
7733 4014967037u,
7734 2070988082u,
7735 2972423530u,
7736 3068638223u,
7737 4156773651u,
7738 489509804u,
7739 1323863238u,
7740 3731914806u,
7741 2846098469u,
7742 2728930632u,
7743 346814072u,
7744 848146907u,
7745 551160669u,
7746 4165126521u,
7747 2039095001u,
7748 4179859388u,
7749 2434936359u,
7750 2764414551u,
7751 238491210u,
7752 732483969u,
7753 3366512764u,
7754 478307468u,
7755 4124179572u,
7756 4142733597u,
7757 1953448206u,
7758 4199329278u,
7759 865077060u,
7760 2627662116u,
7761 2802499360u,
7762 3141206831u,
7763 1959218197u,
7764 911371451u,
7765 125987200u,
7766 2821366175u,
7767 2530992747u,
7768 2409206225u,
7769 117991880u,
7770 2133402461u,
7771 895510531u,
7772 428719601u,
7773 3036014536u,
7774 1223783733u,
7775 733793540u,
7776 970650405u,
7777 547701766u,
7778 570764615u,
7779 3224485368u,
7780 3192714940u,
7781 319942831u,
7782 3940200341u,
7783 362056204u,
7784 2832368105u,
7785 1853281226u,
7786 3296434636u,
7787 3752508307u,
7788 604292768u,
7789 2231940616u,
7790 1204094681u,
7791 866194005u,
7792 2405201650u,
7793 2466384396u,
7794 380829379u,
7795 230033818u,
7796 2783417588u,
7797 4249886729u,
7798 829569301u,
7799 2988322580u,
7800 2299983554u,
7801 74748560u,
7802 737514425u,
7803 3153050211u,
7804 652642663u,
7805 1270205115u,
7806 227197032u,
7807 2773091790u,
7808 325849216u,
7809 49998791u,
7810 4043203010u,
7811 3662748068u,
7812 1709364383u,
7813 1179105165u,
7814 1478504366u,
7815 2980456610u,
7816 1167476429u,
7817 1590390732u,
7818 1306256496u,
7819 292008135u,
7820 374690995u,
7821 1809200819u,
7822 1680595904u,
7823 646040226u,
7824 1742445560u,
7825 2435776844u,
7826 3703683804u,
7827 478742495u,
7828 814967947u,
7829 2698190177u,
7830 1003617993u,
7831 1436118705u,
7832 217056304u,
7833 1412287094u,
7834 2738417466u,
7835 2933279339u,
7836 3461877733u,
7837 1203141205u,
7838 2119492857u,
7839 1134895723u,
7840 1560001021u,
7841 3786320122u,
7842 3748116258u,
7843 3486219595u,
7844 702138030u,
7845 1062984182u,
7846 232789133u,
7847 1566523968u,
7848 3885443778u,
7849 1820171888u,
7850 3655858585u,
7851 2316903005u,
7852 2678779620u,
7853 395625433u,
7854 1609107564u,
7855 3108726411u,
7856 2937837224u,
7857 3911907151u,
7858 557272509u,
7859 3893435978u,
7860 1542613576u,
7861 1079886893u,
7862 2624566322u,
7863 1413700616u,
7864 2796974006u,
7865 1922556114u,
7866 562820464u,
7867 2845409784u,
7868 54180312u,
7869 1898782464u,
7870 3681814953u,
7871 2417064617u,
7872 1815464483u,
7873 911626132u,
7874 2964575550u,
7875 1852696128u,
7876 2319647785u,
7877 1998904590u,
7878 619992689u,
7879 3073207513u,
7880 1238163512u,
7881 3199435982u,
7882 828667254u,
7883 3561155502u,
7884 3943095163u,
7885 1045711849u,
7886 2238679131u,
7887 2114975398u,
7888 713808403u,
7889 3871787494u,
7890 2572031161u,
7891 2360934075u,
7892 2337781107u,
7893 262596504u,
7894 693836699u,
7895 2129369850u,
7896 3543189427u,
7897 962205222u,
7898 3685581020u,
7899 692974477u,
7900 725182211u,
7901 646123906u,
7902 2368836544u,
7903 2505872733u,
7904 1999977610u,
7905 1639885802u,
7906 1475058032u,
7907 207023609u,
7908 2773581234u,
7909 3524857793u,
7910 3433371102u,
7911 3243027613u,
7912 1787668353u,
7913 985757946u,
7914 3896012929u,
7915 702356957u,
7916 3559331129u,
7917 884084870u,
7918 4009998120u,
7919 648888720u,
7920 1403349048u,
7921 1624342778u,
7922 1766674171u,
7923 2518582204u,
7924 3251243146u,
7925 792751003u,
7926 1377201813u,
7927 3629686054u,
7928 1583734324u,
7929 3647107626u,
7930 4258564381u,
7931 1469878609u,
7932 1940598241u,
7933 2755003690u,
7934 1907120418u,
7935 109916701u,
7936 775347954u,
7937 2090960874u,
7938 611281803u,
7939 3470490146u,
7940 3301663253u,
7941 1835412158u,
7942 1803066146u,
7943 591872433u,
7944 550703713u,
7945 1495089683u,
7946 826492808u,
7947 817200035u,
7948 4177474571u,
7949 688070143u,
7950 971427632u,
7951 1442499481u,
7952 3568640348u,
7953 2789993738u,
7954 85808128u,
7955 2058346726u,
7956 394058570u,
7957 3466511434u,
7958 318905230u,
7959 4149248030u,
7960 415308316u,
7961 165997598u,
7962 1219639412u,
7963 1648022659u,
7964 2857432523u,
7965 1422508004u,
7966 468095522u,
7967 296968649u,
7968 430250611u,
7969 1775562314u,
7970 2976361671u,
7971 1040036362u,
7972 1372510167u,
7973 292746272u,
7974 3408238954u,
7975 626061886u,
7976 1317637569u,
7977 1237775792u,
7978 1218490455u,
7979 2224234499u,
7980 590942419u,
7981 713995643u,
7982 3541889330u,
7983 4140218960u,
7984 3529791107u,
7985 354462673u,
7986 842607274u,
7987 365048533u,
7988 2638303414u,
7989 3560458014u,
7990 31621379u,
7991 4210854794u,
7992 1273118792u,
7993 2572743762u,
7994 3513175801u,
7995 402066986u,
7996 602524471u,
7997 565029192u,
7998 180576438u,
7999 1288605959u,
8000 2896244423u,
8001 1420543484u,
8002 1329862227u,
8003 1791567324u,
8004 4248690247u,
8005 12917038u,
8006 3483481310u,
8007 2082050731u,
8008 1611921143u,
8009 2443766548u,
8010 2216338811u,
8011 2528006095u,
8012 2984009021u,
8013 674210884u,
8014 2857608106u,
8015 2155534809u,
8016 1023105067u,
8017 2968955846u,
8018 3303624302u,
8019 2502112850u,
8020 245749006u,
8021 3175229091u,
8022 3342796184u,
8023 3613785362u,
8024 1614168851u,
8025 2582149283u,
8026 895403488u,
8027 416205023u,
8028 3792242000u,
8029 529397534u,
8030 299415203u,
8031 4284673348u,
8032 2096851282u,
8033 1864524731u,
8034 2012577738u,
8035 3426363316u,
8036 1387308508u,
8037 1143610148u,
8038 2027467219u,
8039 3772856163u,
8040 3453862623u,
8041 2661437174u,
8042 2047145955u,
8043 2533381447u,
8044 2059534115u,
8045 439426587u,
8046 1537543414u,
8047 2384289877u,
8048 3174229055u,
8049 2658017753u,
8050 2293148474u,
8051 2359450158u,
8052 3930242475u,
8053 1510302397u,
8054 3354288821u,
8055 920095603u,
8056 2415746928u,
8057 2729472638u,
8058 2261143371u,
8059 848667611u,
8060 919157153u,
8061 3322393117u,
8062 4103299943u,
8063 413569608u,
8064 68911216u,
8065 3334990170u,
8066 1228068652u,
8067 1570056373u,
8068 1905477543u,
8069 2622302276u,
8070 2935063895u,
8071 3224810004u,
8072 4211768578u,
8073 828688131u,
8074 3556122839u,
8075 1930935348u,
8076 2605825202u,
8077 1540993970u,
8078 3209115883u,
8079 122847500u,
8080 665638794u,
8081 506571051u,
8082 2691795295u,
8083 3996966556u,
8084 714660621u,
8085 3662432239u,
8086 470651837u,
8087 1807432621u,
8088 3755290953u,
8089 359878860u,
8090 2793081615u,
8091 4065031431u,
8092 904653062u,
8093 2317800777u,
8094 568501094u,
8095 3492871707u,
8096 2738806116u,
8097 2883859610u,
8098 3242080257u,
8099 364246691u,
8100 3601786516u,
8101 3159362524u,
8102 1578272201u,
8103 1283574375u,
8104 2912186103u,
8105 2256279032u,
8106 1540671086u,
8107 2356088973u,
8108 2892277779u,
8109 3441449267u,
8110 2225005503u,
8111 3846428419u,
8112 2014549218u,
8113 2290734767u,
8114 2126684614u,
8115 4235463487u,
8116 3811556204u,
8117 174739661u,
8118 767525888u,
8119 47684458u,
8120 4211168099u,
8121 889063422u,
8122 469864411u,
8123 767407110u,
8124 413337343u,
8125 1618456644u,
8126 2814499820u,
8127 2401124192u,
8128 632089437u,
8129 1234980238u,
8130 1288585402u,
8131 3153169944u,
8132 2917822069u,
8133 1843320264u,
8134 3794359132u,
8135 3074573530u,
8136 258629454u,
8137 3813357060u,
8138 3806887248u,
8139 1665524736u,
8140 3324533324u,
8141 3005091922u,
8142 793108368u,
8143 1529669805u,
8144 2332660395u,
8145 2217730223u,
8146 2634687611u,
8147 442806463u,
8148 1968135266u,
8149 454523002u,
8150 3177866230u,
8151 2808960136u,
8152 4259114138u,
8153 4103264843u,
8154 3103714075u,
8155 2462967542u,
8156 1466891491u,
8157 477973764u,
8158 834565647u,
8159 741089037u,
8160 218837573u,
8161 1710536528u,
8162 2469088212u,
8163 1229072375u,
8164 2828341u,
8165 176923431u,
8166 985763350u,
8167 4095477420u,
8168 1984145538u,
8169 1870791084u,
8170 674956677u,
8171 1978138947u,
8172 1296493993u,
8173 1818183554u,
8174 3443333721u,
8175 2124949983u,
8176 2549590262u,
8177 2700850794u,
8178 2662736367u,
8179 739638109u,
8180 4061447096u,
8181 2960078422u,
8182 2453781158u,
8183 929570940u,
8184 3200328383u,
8185 2406328791u,
8186 1419180666u,
8187 2152455739u,
8188 2805741044u,
8189 3305999074u,
8190 3183816361u,
8191 2303165050u,
8192 4922104u,
8193 63096005u,
8194 936656347u,
8195 3104453886u,
8196 1088673880u,
8197 1113407526u,
8198 1457890086u,
8199 453478383u,
8200 1107686695u,
8201 3626027824u,
8202 1159687359u,
8203 2248467888u,
8204 2004578380u,
8205 3274954621u,
8206 1787958646u,
8207 2628726704u,
8208 1138419798u,
8209 3735442315u,
8210 692385301u,
8211 313807213u,
8212 2329068673u,
8213 59375364u,
8214 3261084359u,
8215 2088644507u,
8216 2471153194u,
8217 788336435u,
8218 4024527246u,
8219 141504460u,
8220 2307553888u,
8221 1930559950u,
8222 48975711u,
8223 2745693338u,
8224 230161982u,
8225 3429230862u,
8226 1335968626u,
8227 609591304u,
8228 57435073u,
8229 4279281136u,
8230 3152151665u,
8231 3984484924u,
8232 3459883943u,
8233 397478330u,
8234 1738762229u,
8235 3033590066u,
8236 3611539498u,
8237 1363463523u,
8238 3319364965u,
8239 2671169141u,
8240 3819548561u,
8241 1691193757u,
8242 2423834608u,
8243 2820147055u,
8244 1378120632u,
8245 1240565187u,
8246 3180720050u,
8247 680831086u,
8248 3309658414u,
8249 1986166490u,
8250 762099827u,
8251 510883662u,
8252 2047373648u,
8253 3606742294u,
8254 3894965352u,
8255 2342078853u,
8256 1091255717u,
8257 776594727u,
8258 3217317445u,
8259 1574468485u,
8260 3844504016u,
8261 2819598918u,
8262 1037401010u,
8263 2550943503u,
8264 3867184001u,
8265 1687911772u,
8266 165313836u,
8267 1679575281u,
8268 2418947263u,
8269 2038774952u,
8270 3913543652u,
8271 3209155736u,
8272 149905221u,
8273 3859604717u,
8274 713919631u,
8275 4069810796u,
8276 1882959164u,
8277 1019939034u,
8278 2379867302u,
8279 3666323035u,
8280 1157389013u,
8281 2422300650u,
8282 3366777340u,
8283 2526452062u,
8284 1313747885u,
8285 1039617868u,
8286 1620553692u,
8287 2032976978u,
8288 578789528u,
8289 1592846839u,
8290 2270630604u,
8291 897850577u,
8292 1603294178u,
8293 3105664807u,
8294 1442670138u,
8295 1728019360u,
8296 79313861u,
8297 1683031101u,
8298 1913067024u,
8299 4070719870u,
8300 708986470u,
8301 2586453359u,
8302 3993348863u,
8303 3358251279u,
8304 3003552537u,
8305 750174793u,
8306 836888956u,
8307 4190747426u,
8308 4251291318u,
8309 4145164938u,
8310 1366883260u,
8311 1912910955u,
8312 510192669u,
8313 1851315039u,
8314 3574241274u,
8315 3220062924u,
8316 2821142039u,
8317 1317082195u,
8318 2274293302u,
8319 1839219569u,
8320 126586168u,
8321 3989293643u,
8322 2680178207u,
8323 347056948u,
8324 799681430u,
8325 2864517481u,
8326 3180404853u,
8327 213140045u,
8328 1956305184u,
8329 1474675286u,
8330 3085723423u,
8331 2841859626u,
8332 308421914u,
8333 3670309263u,
8334 1765052231u,
8335 245459238u,
8336 113434331u,
8337 4079521092u,
8338 2115235526u,
8339 2943408816u,
8340 1055476938u,
8341 1506442339u,
8342 2291296392u,
8343 3267864332u,
8344 1282145528u,
8345 3700108015u,
8346 1932843667u,
8347 2677701670u,
8348 6041177u,
8349 3889648557u,
8350 1461025478u,
8351 };
8352
8353 // Return false only if offset is -1 and a spot check of 3 hashes all yield 0.
8354 bool Test(int offset, int len = 0) {
8355 #undef Check
8356 #undef IsAlive
8357
8358 #define Check(x) do { \
8359 const uint32_t actual = (x), e = expected[index++]; \
8360 bool ok = actual == e; \
8361 if (!ok) { \
8362 cerr << "expected " << hex << e << " but got " << actual << endl; \
8363 ++errors; \
8364 } \
8365 assert(ok); \
8366 } while (0)
8367
8368 #define IsAlive(x) do { alive += IsNonZero(x); } while (0)
8369
8370 // After the following line is where the uses of "Check" and such will go.
8371 static int index = 0;
8372 if (offset == -1) { int alive = 0; IsAlive(farmhashsu::Hash32WithSeed(data, len+ +, SEED)); IsAlive(farmhashsu::Hash32(data, len++)); IsAlive(farmhashsu::Hash32( data, len++)); len -= 3; return alive > 0; }
8373 Check(farmhashsu::Hash32WithSeed(data + offset, len, SEED));
8374 Check(farmhashsu::Hash32(data + offset, len));
8375
8376 return true;
8377 #undef Check
8378 #undef IsAlive
8379 }
8380
8381 int RunTest() {
8382 Setup();
8383 int i = 0;
8384 cout << "Running farmhashsuTest";
8385 if (!Test(-1)) {
8386 cout << "... Unavailable\n";
8387 return NoteErrors();
8388 }
8389 // Good. The function is attempting to hash, so run the full test.
8390 int errors_prior_to_test = errors;
8391 for ( ; i < kTestSize - 1; i++) {
8392 Test(i * i, i);
8393 }
8394 for ( ; i < kDataSize; i += i / 7) {
8395 Test(0, i);
8396 }
8397 Test(0, kDataSize);
8398 cout << (errors == errors_prior_to_test ? "... OK\n" : "... Failed\n");
8399 return NoteErrors();
8400 }
8401
8402 #else
8403
8404 // After the following line is where the code to print hash codes will go.
8405 void Dump(int offset, int len) {
8406 cout << farmhashsu::Hash32WithSeed(data + offset, len, SEED) << "u," << endl;
8407 cout << farmhashsu::Hash32(data + offset, len) << "u," << endl;
8408 }
8409
8410 #endif
8411
8412 #undef SEED
8413 #undef SEED1
8414 #undef SEED0
8415
8416 } // namespace farmhashsuTest
8417
8418 #if TESTING
8419
8420 static int farmhashsuTestResult = farmhashsuTest::RunTest();
8421
8422 #else
8423 int main(int argc, char** argv) {
8424 Setup();
8425 cout << "uint32_t expected[] = {\n";
8426 int i = 0;
8427 for ( ; i < kTestSize - 1; i++) {
8428 farmhashsuTest::Dump(i * i, i);
8429 }
8430 for ( ; i < kDataSize; i += i / 7) {
8431 farmhashsuTest::Dump(0, i);
8432 }
8433 farmhashsuTest::Dump(0, kDataSize);
8434 cout << "};\n";
8435 }
8436 #endif
8437 #ifndef FARMHASH_SELF_TEST_GUARD
8438 #define FARMHASH_SELF_TEST_GUARD
8439 #include <cstdio>
8440 #include <iostream>
8441 #include <string.h>
8442
8443 using std::cout;
8444 using std::cerr;
8445 using std::endl;
8446 using std::hex;
8447
8448 static const uint64_t kSeed0 = 1234567;
8449 static const uint64_t kSeed1 = k0;
8450 static const int kDataSize = 1 << 20;
8451 static const int kTestSize = 300;
8452 #define kSeed128 Uint128(kSeed0, kSeed1)
8453
8454 static char data[kDataSize];
8455
8456 static int completed_self_tests = 0;
8457 static int errors = 0;
8458
8459 // Initialize data to pseudorandom values.
8460 void Setup() {
8461 if (completed_self_tests == 0) {
8462 uint64_t a = 9;
8463 uint64_t b = 777;
8464 for (int i = 0; i < kDataSize; i++) {
8465 a += b;
8466 b += a;
8467 a = (a ^ (a >> 41)) * k0;
8468 b = (b ^ (b >> 41)) * k0 + i;
8469 uint8_t u = b >> 37;
8470 memcpy(data + i, &u, 1); // uint8_t -> char
8471 }
8472 }
8473 }
8474
8475 int NoteErrors() {
8476 #define NUM_SELF_TESTS 9
8477 if (++completed_self_tests == NUM_SELF_TESTS)
8478 std::exit(errors > 0);
8479 return errors;
8480 }
8481
8482 template <typename T> inline bool IsNonZero(T x) {
8483 return x != 0;
8484 }
8485
8486 template <> inline bool IsNonZero<uint128_t>(uint128_t x) {
8487 return x != Uint128(0, 0);
8488 }
8489
8490 #endif // FARMHASH_SELF_TEST_GUARD
8491
8492 namespace farmhashteTest {
8493
8494 uint32_t CreateSeed(int offset, int salt) {
8495 uint32_t h = static_cast<uint32_t>(salt & 0xffffffff);
8496 h = h * c1;
8497 h ^= (h >> 17);
8498 h = h * c1;
8499 h ^= (h >> 17);
8500 h = h * c1;
8501 h ^= (h >> 17);
8502 h += static_cast<uint32_t>(offset & 0xffffffff);
8503 h = h * c1;
8504 h ^= (h >> 17);
8505 h = h * c1;
8506 h ^= (h >> 17);
8507 h = h * c1;
8508 h ^= (h >> 17);
8509 return h;
8510 }
8511
8512 #undef SEED
8513 #undef SEED1
8514 #undef SEED0
8515 #define SEED CreateSeed(offset, -1)
8516 #define SEED0 CreateSeed(offset, 0)
8517 #define SEED1 CreateSeed(offset, 1)
8518
8519 #undef TESTING
8520 #define TESTING 1
8521 #if TESTING
8522 uint32_t expected[] = {
8523 1140953930u, 861465670u,
8524 3277735313u, 2681724312u,
8525 2598464059u, 797982799u,
8526 890626835u, 800175912u,
8527 2603993599u, 921001710u,
8528 1410420968u, 2134990486u,
8529 3283896453u, 1867689945u,
8530 2914424215u, 2244477846u,
8531 255297188u, 2992121793u,
8532 1110588164u, 4186314283u,
8533 161451183u, 3943596029u,
8534 4019337850u, 452431531u,
8535 283198166u, 2741341286u,
8536 3379021470u, 2557197665u,
8537 299850021u, 2532580744u,
8538 452473466u, 1706958772u,
8539 1298374911u, 3099673830u,
8540 2199864459u, 3696623795u,
8541 236935126u, 2976578695u,
8542 4055299123u, 3281581178u,
8543 1053458494u, 1882212500u,
8544 2305012065u, 2169731866u,
8545 3456121707u, 275903667u,
8546 458884671u, 3033004529u,
8547 3058973506u, 2379411653u,
8548 1898235244u, 1402319660u,
8549 2700149065u, 2699376854u,
8550 147814787u, 720739346u,
8551 2433714046u, 4222949502u,
8552 4220361840u, 1712034059u,
8553 3425469811u, 3690733394u,
8554 4148372108u, 1330324210u,
8555 594028478u, 2921867846u,
8556 1635026870u, 192883107u,
8557 780716741u, 1728752234u,
8558 3280331829u, 326029180u,
8559 3969463346u, 1436364519u,
8560 393215742u, 3349570000u,
8561 3824583307u, 1612122221u,
8562 2859809759u, 3808705738u,
8563 1379537552u, 1646032583u,
8564 2233466664u, 1432476832u,
8565 4023053163u, 2650381482u,
8566 2052294713u, 3552092450u,
8567 1628777059u, 1499109081u,
8568 3476440786u, 3829307897u,
8569 2960536756u, 1554038301u,
8570 1145519619u, 3190844552u,
8571 2902102606u, 3600725550u,
8572 237495366u, 540224401u,
8573 65721842u, 489963606u,
8574 1448662590u, 397635823u,
8575 1596489240u, 1562872448u,
8576 1790705123u, 2128624475u,
8577 180854224u, 2604346966u,
8578 1435705557u, 1262831810u,
8579 155445229u, 1672724608u,
8580 1669465176u, 1341975128u,
8581 663607706u, 2077310004u,
8582 3610042449u, 1911523866u,
8583 1043692997u, 1454396064u,
8584 2563776023u, 294527927u,
8585 1099072299u, 1389770549u,
8586 703505868u, 678706990u,
8587 2952353448u, 2026137563u,
8588 3603803785u, 629449419u,
8589 1933894405u, 3043213226u,
8590 226132789u, 2489287368u,
8591 1552847036u, 645684964u,
8592 3828089804u, 3632594520u,
8593 187883449u, 230403464u,
8594 3151491850u, 3272648435u,
8595 3729087873u, 1303930448u,
8596 2002861219u, 165370827u,
8597 916494250u, 1230085527u,
8598 3103338579u, 3064290191u,
8599 3807265751u, 3628174014u,
8600 231181488u, 851743255u,
8601 2295806711u, 1781190011u,
8602 2988893883u, 1554380634u,
8603 1142264800u, 3667013118u,
8604 1968445277u, 315203929u,
8605 2638023604u, 2290487377u,
8606 732137533u, 1909203251u,
8607 440398219u, 1891630171u,
8608 1380301172u, 1498556724u,
8609 4072067757u, 4165088768u,
8610 4204318635u, 441430649u,
8611 3931792696u, 197618179u,
8612 956300927u, 914413116u,
8613 3010839769u, 2837339569u,
8614 2148126371u, 1913303225u,
8615 3074915312u, 3117299654u,
8616 4139181436u, 2993479124u,
8617 3178848746u, 1357272220u,
8618 1438494951u, 507436733u,
8619 667183474u, 2084369203u,
8620 3854939912u, 1413396341u,
8621 126024219u, 146044391u,
8622 1016656857u, 3022024459u,
8623 3254014218u, 429095991u,
8624 990500595u, 3056862311u,
8625 985653208u, 1718653828u,
8626 623071693u, 366414107u,
8627 1771289760u, 2293458109u,
8628 3047342438u, 2991127487u,
8629 3120876698u, 1684583131u,
8630 3638043310u, 1170404994u,
8631 863214540u, 1087193030u,
8632 199124911u, 520792961u,
8633 3169775996u, 1577421232u,
8634 3331828431u, 1013201099u,
8635 1716848157u, 4033596884u,
8636 1770708857u, 4229339322u,
8637 1146169032u, 1434258493u,
8638 3824360466u, 3242407770u,
8639 1926419493u, 2649785113u,
8640 872586426u, 762243036u,
8641 2736953692u, 816692935u,
8642 1571283333u, 3555213933u,
8643 2266795890u, 3781899767u,
8644 4290630595u, 517646945u,
8645 3006163611u, 2180594090u,
8646 959214578u, 558910384u,
8647 1283799121u, 3047062993u,
8648 3830962609u, 2391606125u,
8649 3544509313u, 622325861u,
8650 834785312u, 382936554u,
8651 1421463872u, 788479970u,
8652 1825135056u, 2725923798u,
8653 580988377u, 2826990641u,
8654 247825043u, 3167748333u,
8655 812546227u, 2506885666u,
8656 2584372201u, 1758123094u,
8657 1891789696u, 389974094u,
8658 345313518u, 2022370576u,
8659 3886113119u, 3338548567u,
8660 1083486947u, 2583576230u,
8661 1776047957u, 1771384107u,
8662 3604937815u, 3198590202u,
8663 3027522813u, 4155628142u,
8664 4232136669u, 427759438u,
8665 4244322689u, 542201663u,
8666 1549591985u, 2856634168u,
8667 556609672u, 45845311u,
8668 1175961330u, 3948351189u,
8669 4165739882u, 4194218315u,
8670 1634635545u, 4151937410u,
8671 713127376u, 1467786451u,
8672 1327394015u, 2743592929u,
8673 2638154051u, 810082938u,
8674 3077742128u, 1062268187u,
8675 4084325664u, 3810665822u,
8676 3735739145u, 2794294783u,
8677 2335576331u, 2560479831u,
8678 690240711u, 997658837u,
8679 2442302747u, 3948961926u,
8680 3958366652u, 3067277639u,
8681 2059157774u, 1211737169u,
8682 1516711748u, 2339636583u,
8683 4188504038u, 59581167u,
8684 2767897792u, 1389679610u,
8685 2658147000u, 2643979752u,
8686 3758739543u, 4189944477u,
8687 1454470782u, 100876854u,
8688 2995362413u, 118817200u,
8689 3252925478u, 2062343506u,
8690 2804483644u, 3088828656u,
8691 1231633714u, 4168280671u,
8692 2931588131u, 3284356565u,
8693 1255909792u, 3130054947u,
8694 4173605289u, 1407328702u,
8695 1677744031u, 3532596884u,
8696 3162657845u, 3887208531u,
8697 2256541290u, 3459463480u,
8698 3740979556u, 259034107u,
8699 392987633u, 3233195759u,
8700 3606709555u, 3424793077u,
8701 315836068u, 3200749877u,
8702 4065431359u, 760633989u,
8703 2982018998u, 1811050648u,
8704 234531934u, 1115203611u,
8705 3897494162u, 1516407838u,
8706 1603559457u, 323296368u,
8707 2632963283u, 1778459926u,
8708 2879836826u, 2146672889u,
8709 3486330348u, 492621815u,
8710 1231665285u, 2457048126u,
8711 3438440082u, 2217471853u,
8712 3355404249u, 3275550588u,
8713 1052645068u, 862072556u,
8714 4110617119u, 3745267835u,
8715 2657392572u, 4279236653u,
8716 1688445808u, 701920051u,
8717 956734128u, 581695350u,
8718 3157862788u, 2585726058u,
8719 1192588249u, 1410111809u,
8720 1651193125u, 3326135446u,
8721 1073280453u, 97376972u,
8722 2513844237u, 2187968410u,
8723 3976859649u, 4267859263u,
8724 3429034542u, 564493077u,
8725 3000537321u, 479241367u,
8726 3845637831u, 2868987960u,
8727 51544337u, 1029173765u,
8728 393624922u, 704325635u,
8729 2357610553u, 1418509533u,
8730 2007814586u, 3866658271u,
8731 3082385053u, 735688735u,
8732 916110004u, 3283299459u,
8733 1051684175u, 1083796807u,
8734 4074716319u, 813690332u,
8735 144264390u, 1439630796u,
8736 1508556987u, 675582689u,
8737 3748881891u, 3195309868u,
8738 362884708u, 1616408198u,
8739 43233176u, 837301135u,
8740 881504822u, 3254795114u,
8741 1385506591u, 2799925823u,
8742 1469874582u, 3464841997u,
8743 497175391u, 3929484338u,
8744 3975771289u, 1798536177u,
8745 2926265846u, 1374242438u,
8746 3675707838u, 4205965408u,
8747 3153165629u, 1499475160u,
8748 187287713u, 548490821u,
8749 3255259608u, 4247675634u,
8750 1940181471u, 3779953975u,
8751 687167150u, 2319566715u,
8752 1742785722u, 785893184u,
8753 2296977392u, 2778575413u,
8754 1794720651u, 48131484u,
8755 4084891412u, 1160134629u,
8756 3737623280u, 823113169u,
8757 3423207646u, 3803213486u,
8758 710625654u, 4116162021u,
8759 3693420287u, 4167766971u,
8760 1666602807u, 295320990u,
8761 3513255468u, 2487440590u,
8762 234080704u, 4004655503u,
8763 2971762528u, 1479656873u,
8764 4090178629u, 4044418876u,
8765 391947536u, 1462554406u,
8766 3909295855u, 1239580330u,
8767 1515601363u, 2011102035u,
8768 1442068334u, 4265993528u,
8769 1191921695u, 2291355695u,
8770 4257172787u, 576405853u,
8771 314332944u, 4038839101u,
8772 55559918u, 2378985842u,
8773 711098718u, 2425317635u,
8774 1644327317u, 1401013391u,
8775 4193760037u, 2958260436u,
8776 3167371443u, 3062418115u,
8777 3800755475u, 3167030094u,
8778 3489648204u, 1405430357u,
8779 526177822u, 2602636307u,
8780 915406019u, 4264167741u,
8781 1484090483u, 3070944737u,
8782 254529415u, 4017058800u,
8783 1702710265u, 1029665228u,
8784 2000382906u, 3185573940u,
8785 1381258384u, 4036354071u,
8786 2900841028u, 2670703363u,
8787 2921748807u, 2899069938u,
8788 4130543625u, 688472265u,
8789 4186808827u, 1054670286u,
8790 1132985391u, 2840525968u,
8791 4175776103u, 338058159u,
8792 1735964501u, 1539305024u,
8793 3497121710u, 1568260669u,
8794 2227290760u, 146827036u,
8795 3977176001u, 4060134777u,
8796 857488494u, 250055052u,
8797 4284109679u, 2502815838u,
8798 2592281721u, 1603444633u,
8799 1390562014u, 1556658131u,
8800 616327404u, 2448966429u,
8801 3051191726u, 3891353218u,
8802 1213304082u, 762328245u,
8803 2239052397u, 1082330589u,
8804 2455957292u, 201837927u,
8805 405397452u, 3079886794u,
8806 2583939798u, 2848283092u,
8807 3750724631u, 883849006u,
8808 3204198988u, 3341327098u,
8809 1855234968u, 1982110346u,
8810 1485529487u, 541496720u,
8811 4117290321u, 3607433551u,
8812 2168864636u, 133643215u,
8813 1055817409u, 3847827123u,
8814 2960769387u, 4046101649u,
8815 1176127003u, 4015671361u,
8816 4243643405u, 2849988118u,
8817 517111221u, 1796672358u,
8818 2045051700u, 3452457457u,
8819 2948254999u, 2102063419u,
8820 1556410577u, 1536380876u,
8821 3776661467u, 3281002516u,
8822 1735616066u, 1539151988u,
8823 1087795162u, 3332431596u,
8824 685631442u, 1147951686u,
8825 95237878u, 2005032160u,
8826 4012206915u, 4224354805u,
8827 3204999386u, 2415262714u,
8828 1433635018u, 116647396u,
8829 83167836u, 2881562655u,
8830 2729416454u, 1029284767u,
8831 881378302u, 2159170082u,
8832 555057366u, 1169104445u,
8833 3963877000u, 1919171906u,
8834 336034862u, 2017579106u,
8835 4059340529u, 3020819343u,
8836 865146997u, 2473524405u,
8837 944743644u, 1694443528u,
8838 1804513294u, 2904752429u,
8839 617975720u, 3671562289u,
8840 260177668u, 505662155u,
8841 1885941445u, 2504509403u,
8842 2260041112u, 1019936943u,
8843 3722741628u, 1511077569u,
8844 3100701179u, 1379422864u,
8845 1535670711u, 773792826u,
8846 1103819072u, 2089123665u,
8847 1157547425u, 329152940u,
8848 4142587430u, 484732447u,
8849 2475035432u, 1120017626u,
8850 412145504u, 965125959u,
8851 324924679u, 2809286837u,
8852 2842141483u, 4029205195u,
8853 2974306813u, 515627448u,
8854 3791551981u, 1097806406u,
8855 3873078673u, 136118734u,
8856 1872130856u, 3632422367u,
8857 3574135531u, 4017075736u,
8858 1699452298u, 1403506686u,
8859 344414660u, 1189129691u,
8860 3487080616u, 1516736273u,
8861 1805475756u, 2562064338u,
8862 163335594u, 2732147834u,
8863 4077452507u, 2984955003u,
8864 4271866024u, 3071338162u,
8865 2347111903u, 873829983u,
8866 1948409509u, 1923531348u,
8867 459509140u, 771592405u,
8868 1750124750u, 2334938333u,
8869 213811117u, 2586632018u,
8870 185232757u, 4032960199u,
8871 2447383637u, 284777551u,
8872 1654276320u, 2687561076u,
8873 3512945009u, 308584855u,
8874 1861027147u, 4102279334u,
8875 3203802620u, 1692079268u,
8876 4250142168u, 2565680167u,
8877 1507046104u, 841195925u,
8878 520565830u, 3674576684u,
8879 38924274u, 3770488806u,
8880 2414430882u, 3978473838u,
8881 3703994407u, 69201295u,
8882 3099963860u, 1255084262u,
8883 690971838u, 3539996781u,
8884 3696902571u, 3593730713u,
8885 2363435042u, 54945052u,
8886 1785765213u, 184911581u,
8887 1586241476u, 1939595371u,
8888 2534883189u, 2432427547u,
8889 2374171993u, 2039128933u,
8890 2955715987u, 2295501078u,
8891 2741583197u, 1280920000u,
8892 686818699u, 1238742497u,
8893 3843660102u, 82177963u,
8894 1281043691u, 1121403845u,
8895 1697846708u, 284852964u,
8896 278661677u, 2889101923u,
8897 2127558730u, 713121337u,
8898 872502474u, 511142139u,
8899 1261140657u, 1747052377u,
8900 2108187161u, 927011680u,
8901 955328267u, 3821994995u,
8902 2707230761u, 4142246789u,
8903 4134691985u, 1958963937u,
8904 2498463509u, 1977988705u,
8905 1419293714u, 1636932722u,
8906 2567532373u, 4075249328u,
8907 240575705u, 1956681213u,
8908 2598802768u, 2025886508u,
8909 4104757832u, 3026358429u,
8910 3242615202u, 4026813725u,
8911 255108733u, 1845587644u,
8912 3573008472u, 3615577014u,
8913 1222733548u, 1205557630u,
8914 917608574u, 1363253259u,
8915 1541946015u, 3087190425u,
8916 1138008081u, 1444019663u,
8917 109793386u, 341851980u,
8918 857839960u, 2515339233u,
8919 156283211u, 1906768669u,
8920 3886713057u, 1276595523u,
8921 2809830736u, 460237542u,
8922 3420452099u, 142985419u,
8923 205970448u, 4198897105u,
8924 1950698961u, 2069753399u,
8925 1142216925u, 1113051162u,
8926 1033680610u, 4278599955u,
8927 1106466069u, 356742959u,
8928 531521052u, 3494863964u,
8929 225629455u, 3735275001u,
8930 3662626864u, 1750561299u,
8931 1012864651u, 2101846429u,
8932 1074553219u, 668829411u,
8933 992181339u, 3384018814u,
8934 3330664522u, 860966321u,
8935 1885071395u, 4233785523u,
8936 100741310u, 451656820u,
8937 2148187612u, 1063001151u,
8938 360256231u, 107312677u,
8939 3650357479u, 2390172694u,
8940 22452685u, 237319043u,
8941 3600462351u, 1216645846u,
8942 2088767754u, 164402616u,
8943 2418980170u, 926137824u,
8944 94638678u, 1689811113u,
8945 2751052984u, 1767810825u,
8946 271289013u, 3896132233u,
8947 103797041u, 1397772514u,
8948 3441135892u, 3323383489u,
8949 2491268371u, 1662561885u,
8950 1612872497u, 2986430557u,
8951 2756998822u, 207428029u,
8952 937973965u, 2791656726u,
8953 1949717207u, 2260498180u,
8954 2648427775u, 2360400900u,
8955 2080496169u, 486358863u,
8956 1582022990u, 1263709570u,
8957 1396468647u, 1377764574u,
8958 363008508u, 1293502429u,
8959 224580012u, 4252610345u,
8960 1435134775u, 1099809675u,
8961 533671980u, 1533438766u,
8962 1820532305u, 2776960536u,
8963 3374512975u, 3542220540u,
8964 822810075u, 3716663290u,
8965 1157398049u, 3752806924u,
8966 4081637863u, 337070226u,
8967 3866585976u, 359270190u,
8968 2110942730u, 3267551635u,
8969 644850146u, 1306761320u,
8970 746972907u, 934259457u,
8971 2341378668u, 2220373824u,
8972 1242645122u, 4109252858u,
8973 1625266099u, 1173698481u,
8974 383517064u, 896322512u,
8975 3377483696u, 1788337208u,
8976 455496839u, 3194373887u,
8977 1837689083u, 1336556841u,
8978 1658628529u, 2911512007u,
8979 3838343487u, 2757664765u,
8980 1537187340u, 3712582785u,
8981 367022558u, 3071359622u,
8982 3926147070u, 35432879u,
8983 3093195926u, 2561488770u,
8984 4273132307u, 3898950547u,
8985 2838251049u, 2103926083u,
8986 2549435227u, 536047554u,
8987 1858986613u, 2040551642u,
8988 1147412575u, 1972369852u,
8989 4166184983u, 3528794619u,
8990 4077477194u, 3565689036u,
8991 808048238u, 3826350461u,
8992 1359641525u, 1197100813u,
8993 265993036u, 1864569342u,
8994 725164342u, 2264788336u,
8995 1831223342u, 3329594980u,
8996 923017956u, 490608221u,
8997 3818634478u, 258154469u,
8998 1441714797u, 1174785921u,
8999 3833372385u, 3287246572u,
9000 1677395563u, 3569218731u,
9001 868981704u, 2163330264u,
9002 2649450292u, 500120236u,
9003 465161780u, 746438382u,
9004 1145009669u, 2520062970u,
9005 2810524030u, 1561519055u,
9006 1479878006u, 3864969305u,
9007 2686075657u, 4042710240u,
9008 3224066062u, 2774151984u,
9009 2226179547u, 1643626042u,
9010 2328730865u, 3160666939u,
9011 2107011431u, 96459446u,
9012 3920328742u, 3336407558u,
9013 829404209u, 1878067032u,
9014 1235983679u, 4237425634u,
9015 466519055u, 3870676863u,
9016 934312076u, 2952135524u,
9017 276949224u, 4100839753u,
9018 424001484u, 1955120893u,
9019 4015478120u, 1265237690u,
9020 427484362u, 4246879223u,
9021 3452969617u, 1724363362u,
9022 1553513184u, 834830418u,
9023 1858777639u, 3476334357u,
9024 4144030366u, 2450047160u,
9025 2950762705u, 4277111759u,
9026 358032121u, 2511026735u,
9027 167923105u, 2059208280u,
9028 251949572u, 3065234219u,
9029 1535473864u, 556796152u,
9030 1513237478u, 3150857516u,
9031 1103404394u, 198182691u,
9032 1476438092u, 2913077464u,
9033 207119516u, 3963810232u,
9034 2954651680u, 1535115487u,
9035 3051522276u, 4046477658u,
9036 917804636u, 864395565u,
9037 632704095u, 140762681u,
9038 1802040304u, 990407433u,
9039 3771506212u, 4106024923u,
9040 1287729497u, 2198985327u,
9041 4052924496u, 2926590471u,
9042 3084557148u, 1472898694u,
9043 1009870118u, 559702706u,
9044 4265214507u, 82077489u,
9045 3067891003u, 3295678907u,
9046 2402308151u, 1096697687u,
9047 464407878u, 4190838199u,
9048 4269578403u, 3060919438u,
9049 2899950405u, 3046872820u,
9050 733509243u, 1583801700u,
9051 40453902u, 3879773881u,
9052 1993425202u, 2185339100u,
9053 1877837196u, 3912423882u,
9054 3293122640u, 4104318469u,
9055 1679617763u, 3703603898u,
9056 8759461u, 2540185277u,
9057 1152198475u, 2038345882u,
9058 2503579743u, 1446869792u,
9059 2019419351u, 4051584612u,
9060 3178289407u, 3992503830u,
9061 2879018745u, 2719373510u,
9062 700836153u, 1675560450u,
9063 4121245793u, 2064715719u,
9064 343595772u, 1996164093u,
9065 3130433948u, 405251683u,
9066 2804817126u, 1607133689u,
9067 463852893u, 2864244470u,
9068 2224044848u, 4071581802u,
9069 2537107938u, 2246347953u,
9070 3207234525u, 2028708916u,
9071 2272418128u, 803575837u,
9072 38655481u, 2170452091u,
9073 3272166407u, 557660441u,
9074 4019147902u, 3841480082u,
9075 298459606u, 2600943364u,
9076 2440657523u, 255451671u,
9077 3424361375u, 779434428u,
9078 3088526123u, 490671625u,
9079 1322855877u, 3452203069u,
9080 3057021940u, 2285701422u,
9081 2014993457u, 2390431709u,
9082 2002090272u, 1568745354u,
9083 1783152480u, 823305654u,
9084 4053862835u, 2200236540u,
9085 3009412313u, 3184047862u,
9086 3032187389u, 4159715581u,
9087 2966902888u, 252986948u,
9088 1849329144u, 3160134214u,
9089 3420960112u, 3198900547u,
9090 749160960u, 379139040u,
9091 1208883495u, 1566527339u,
9092 3006227299u, 4194096960u,
9093 556075248u, 497404038u,
9094 1717327230u, 1496132623u,
9095 1775955687u, 1719108984u,
9096 1014328900u, 4189966956u,
9097 2108574735u, 2584236470u,
9098 684087286u, 531310503u,
9099 4264509527u, 773405691u,
9100 3088905079u, 3456882941u,
9101 3105682208u, 3382290593u,
9102 2289363624u, 3296306400u,
9103 4168438718u, 467441309u,
9104 777173623u, 3241407531u,
9105 1183994815u, 1132983260u,
9106 1610606159u, 2540270567u,
9107 2649684057u, 1397502982u,
9108 146657385u, 3318434267u,
9109 2109315753u, 3348545480u,
9110 3193669211u, 811750340u,
9111 1073256162u, 3571673088u,
9112 546596661u, 1017047954u,
9113 3403136990u, 2540585554u,
9114 1477047647u, 4145867423u,
9115 2826408201u, 3531646869u,
9116 784952939u, 943914610u,
9117 2717443875u, 3657384638u,
9118 1806867885u, 1903578924u,
9119 3985088434u, 1911188923u,
9120 1764002686u, 3672748083u,
9121 1832925325u, 241574049u,
9122 519948041u, 3181425568u,
9123 2939747257u, 1634174593u,
9124 3429894862u, 3529565564u,
9125 1089679033u, 240953857u,
9126 2025369941u, 2695166650u,
9127 517086873u, 2964595704u,
9128 3017658263u, 3828377737u,
9129 2144895011u, 994799311u,
9130 1184683823u, 4260564140u,
9131 308018483u, 4262383425u,
9132 1374752558u, 3431057723u,
9133 1572637805u, 383233885u,
9134 3188015819u, 4051263539u,
9135 233319221u, 3794788167u,
9136 2017406667u, 919677938u,
9137 4074952232u, 1683612329u,
9138 4213676186u, 327142514u,
9139 3032591014u, 4204155962u,
9140 206775997u, 2283918569u,
9141 2395147154u, 3427505379u,
9142 2211319468u, 4153726847u,
9143 2217060665u, 350160869u,
9144 2493667051u, 1648200185u,
9145 3441709766u, 1387233546u,
9146 140980u, 1891558063u,
9147 760080239u, 2088061981u,
9148 1580964938u, 740563169u,
9149 422986366u, 330624974u,
9150 4264507722u, 150928357u,
9151 2738323042u, 2948665536u,
9152 918718096u, 376390582u,
9153 3966098971u, 717653678u,
9154 3219466255u, 3799363969u,
9155 3424344721u, 3187805406u,
9156 375347278u, 3490350144u,
9157 1992212097u, 2263421398u,
9158 3855037968u, 1928519266u,
9159 3866327955u, 1129127000u,
9160 1782515131u, 2746577402u,
9161 3059200728u, 2108753646u,
9162 2738070963u, 1336849395u,
9163 1705302106u, 768287270u,
9164 1343511943u, 2247006571u,
9165 1956142255u, 1780259453u,
9166 3475618043u, 212490675u,
9167 622521957u, 917121602u,
9168 1852992332u, 1267987847u,
9169 3170016833u, 2549835613u,
9170 3299763344u, 2864033668u,
9171 3378768767u, 1236609378u,
9172 4169365948u, 3738062408u,
9173 2661022773u, 2006922227u,
9174 2760592161u, 3828932355u,
9175 2636387819u, 2616619070u,
9176 1237256330u, 3449066284u,
9177 2871755260u, 3729280948u,
9178 3862686086u, 431292293u,
9179 3285899651u, 786322314u,
9180 2531158535u, 724901242u,
9181 2377363130u, 1415970351u,
9182 1244759631u, 3263135197u,
9183 965248856u, 174024139u,
9184 2297418515u, 2954777083u,
9185 987586766u, 3206261120u,
9186 4059515114u, 3903854066u,
9187 1931934525u, 2287507921u,
9188 1827135136u, 1781944746u,
9189 574617451u, 2299034788u,
9190 2650140034u, 4081586725u,
9191 2482286699u, 1109175923u,
9192 458483596u, 618705848u,
9193 4059852729u, 1813855658u,
9194 4190721328u, 1129462471u,
9195 4089998050u, 3575732749u,
9196 2375584220u, 1037031473u,
9197 1623777358u, 3389003793u,
9198 546597541u, 352770237u,
9199 1383747654u, 3122687303u,
9200 1646071378u, 1164309901u,
9201 290870767u, 830691298u,
9202 929335420u, 3193251135u,
9203 989577914u, 3626554867u,
9204 591974737u, 3996958215u,
9205 3163711272u, 3071568023u,
9206 1516846461u, 3656006011u,
9207 2698625268u, 2510865430u,
9208 340274176u, 1167681812u,
9209 3698796465u, 3155218919u,
9210 4102288238u, 1673474350u,
9211 3069708839u, 2704165015u,
9212 1237411891u, 1854985978u,
9213 3646837503u, 3625406022u,
9214 921552000u, 1712976649u,
9215 3939149151u, 878608872u,
9216 3406359248u, 1068844551u,
9217 1834682077u, 4155949943u,
9218 2437686324u, 3163786257u,
9219 2645117577u, 1988168803u,
9220 747285578u, 1626463554u,
9221 1235300371u, 1256485167u,
9222 1914142538u, 4141546431u,
9223 3838102563u, 582664250u,
9224 1883344352u, 2083771672u,
9225 2611657933u, 2139079047u,
9226 2250573853u, 804336148u,
9227 3066325351u, 2770847216u,
9228 4275641370u, 1455750577u,
9229 3346357270u, 1674051445u,
9230 601221482u, 3992583643u,
9231 1402445097u, 3622527604u,
9232 2509017299u, 2966108111u,
9233 2557027816u, 900741486u,
9234 1790771021u, 2912643797u,
9235 2631381069u, 4014551783u,
9236 90375300u, 300318232u,
9237 3269968032u, 2679371729u,
9238 2664752123u, 3517585534u,
9239 3253901179u, 542270815u,
9240 1188641600u, 365479232u,
9241 2210121140u, 760762191u,
9242 1273768482u, 1216399252u,
9243 3484324231u, 4287337666u,
9244 16322182u, 643179562u,
9245 325675502u, 3652676161u,
9246 3120716054u, 3330259752u,
9247 1011990087u, 2990167340u,
9248 1097584090u, 3262252593u,
9249 1829409951u, 3665087267u,
9250 1214854475u, 2134299399u,
9251 3704419305u, 411263051u,
9252 1625446136u, 549838529u,
9253 4283196353u, 1342880802u,
9254 3460621305u, 1967599860u,
9255 4282843369u, 1275671016u,
9256 2544665755u, 853593042u,
9257 901109753u, 2682611693u,
9258 110631633u, 797487791u,
9259 1472073141u, 850464484u,
9260 797089608u, 3286110054u,
9261 350397471u, 2775631060u,
9262 366448238u, 3842907484u,
9263 2219863904u, 3623364733u,
9264 1850985302u, 4009616991u,
9265 294963924u, 3693536939u,
9266 3061255808u, 1615375832u,
9267 1920066675u, 4113028420u,
9268 4032223840u, 2318423400u,
9269 2701956286u, 4145497671u,
9270 3991532344u, 2536338351u,
9271 1679099863u, 1728968857u,
9272 449740816u, 2686506989u,
9273 685242457u, 97590863u,
9274 3258354115u, 1502282913u,
9275 1235084019u, 2151665147u,
9276 528459289u, 231097464u,
9277 2477280726u, 3651607391u,
9278 2091754612u, 1178454681u,
9279 980597335u, 1604483865u,
9280 1842333726u, 4146839064u,
9281 3213794286u, 2601416506u,
9282 754220096u, 3571436033u,
9283 488595746u, 1448097974u,
9284 4004834921u, 238887261u,
9285 3320337489u, 1416989070u,
9286 2928916831u, 4093725287u,
9287 186020771u, 2367569534u,
9288 3046087671u, 4090084518u,
9289 3548184546u, 679517009u,
9290 1962659444u, 3539886328u,
9291 4192003933u, 1678423485u,
9292 3827951761u, 3086277222u,
9293 2144472852u, 1390394371u,
9294 2976322029u, 1574517163u,
9295 3553313841u, 119173722u,
9296 1702434637u, 1766260771u,
9297 3629581771u, 1407497759u,
9298 895654784u, 751439914u,
9299 4008409498u, 215917713u,
9300 1482103833u, 695551833u,
9301 1288382231u, 2656990891u,
9302 2581779077u, 1570750352u,
9303 3710689053u, 1741390464u,
9304 2666411616u, 3533987737u,
9305 4289478316u, 3576119563u,
9306 4118694920u, 108199666u,
9307 3869794273u, 963183826u,
9308 2081410737u, 3796810515u,
9309 791123882u, 2525792704u,
9310 1036883117u, 136547246u,
9311 875691100u, 2592925324u,
9312 614302599u, 3013176417u,
9313 2689342539u, 427154472u,
9314 532957601u, 1228758574u,
9315 1898117151u, 1181643858u,
9316 1908591042u, 1464255968u,
9317 446980910u, 2984611177u,
9318 58509511u, 1046943619u,
9319 3508927906u, 2001585786u,
9320 2544767379u, 1525438381u,
9321 552181222u, 1959725830u,
9322 879448844u, 1348536411u,
9323 4242243590u, 2861338018u,
9324 1082052441u, 1034351453u,
9325 601175800u, 764077711u,
9326 530635011u, 3785343245u,
9327 2178026726u, 117256687u,
9328 2378297261u, 457568934u,
9329 76438221u, 4104954272u,
9330 956793873u, 3783168634u,
9331 2485968477u, 2381948487u,
9332 4226929450u, 3148473363u,
9333 2518273601u, 3569490233u,
9334 879369091u, 2180270337u,
9335 3674375989u, 1387729170u,
9336 977997984u, 4270646856u,
9337 568650985u, 951677556u,
9338 4213877384u, 2721005055u,
9339 1073364549u, 2563403831u,
9340 1678669911u, 66786703u,
9341 2273631661u, 1149351924u,
9342 3651298990u, 1581883443u,
9343 246723096u, 1895026827u,
9344 3810605772u, 3711056516u,
9345 4058833288u, 2193790614u,
9346 2080120290u, 3638638708u,
9347 2915672708u, 2263003308u,
9348 2361934197u, 4136767460u,
9349 1976115991u, 3448840877u,
9350 2019238520u, 225333538u,
9351 874340815u, 2976159827u,
9352 1555273378u, 3797521928u,
9353 1942347150u, 3262952567u,
9354 435997738u, 340403353u,
9355 2817830907u, 2078619498u,
9356 749534111u, 1178073973u,
9357 894654712u, 3361226032u,
9358 841092198u, 3288261538u,
9359 1696412169u, 1496966875u,
9360 697501571u, 1059158875u,
9361 3739946319u, 2481012988u,
9362 568983526u, 114945840u,
9363 1559249010u, 2218244008u,
9364 2841706923u, 1632780103u,
9365 4020169654u, 2087949619u,
9366 2438736103u, 24032648u,
9367 833416317u, 3787017905u,
9368 2373238993u, 2575395164u,
9369 3434544481u, 3228481067u,
9370 2542976862u, 2971726178u,
9371 2880371864u, 3642087909u,
9372 2407477975u, 2239080836u,
9373 1043714217u, 3894199764u,
9374 2235879182u, 203853421u,
9375 2933669448u, 2504940536u,
9376 834683330u, 425935223u,
9377 3560796393u, 3565833278u,
9378 1668000829u, 3683399154u,
9379 3414330886u, 1748785729u,
9380 1023171602u, 580966986u,
9381 2531038985u, 3227325488u,
9382 2657385925u, 2124704694u,
9383 233442446u, 1107045577u,
9384 3407293834u, 552770757u,
9385 3899097693u, 1067532701u,
9386 115667924u, 1406028344u,
9387 1707768231u, 3724015962u,
9388 2419657149u, 18613994u,
9389 2532882091u, 3476683808u,
9390 1560838678u, 811220224u,
9391 895961699u, 3762914298u,
9392 1328752423u, 1844996900u,
9393 1420427894u, 1848067707u,
9394 1210281744u, 904215228u,
9395 4055325594u, 1118521573u,
9396 2496554183u, 2579259919u,
9397 3996647489u, 3657647605u,
9398 325254059u, 3136157065u,
9399 3951522674u, 4052925250u,
9400 3341068436u, 2287683323u,
9401 1313073005u, 126005630u,
9402 2505120084u, 1194725057u,
9403 853746559u, 3555092974u,
9404 2689238752u, 49515858u,
9405 1244776042u, 1069300695u,
9406 61073168u, 1010661841u,
9407 1269521335u, 1902040126u,
9408 990632502u, 2378708922u,
9409 3858321250u, 1400735275u,
9410 2974699176u, 2771676666u,
9411 170995186u, 2877798589u,
9412 545726212u, 2225229957u,
9413 1086473152u, 3454177594u,
9414 3859483262u, 1499729584u,
9415 2088002891u, 2883475137u,
9416 3222194252u, 4144472319u,
9417 2212229854u, 4146740722u,
9418 567988835u, 1051332394u,
9419 3932046135u, 542648229u,
9420 3017852446u, 1277887997u,
9421 162888005u, 1669710469u,
9422 1492500905u, 553041029u,
9423 1434876932u, 533989516u,
9424 3817492747u, 584127807u,
9425 4147115982u, 2993670925u,
9426 4020312558u, 710021255u,
9427 3509733475u, 3587959456u,
9428 2088550465u, 1745399498u,
9429 2952242967u, 1259815443u,
9430 869648362u, 1404723176u,
9431 3947542735u, 1334333531u,
9432 3873471582u, 229399758u,
9433 59634866u, 3239516985u,
9434 3844250972u, 1275954779u,
9435 492891666u, 1029533080u,
9436 1552951157u, 367320647u,
9437 699480890u, 3684418197u,
9438 3707014310u, 471105777u,
9439 1824587258u, 4030809053u,
9440 3489914436u, 484559105u,
9441 1235750398u, 1428453396u,
9442 4230459084u, 4255931645u,
9443 1848597055u, 4271715616u,
9444 331780381u, 482425775u,
9445 2435323270u, 3171911678u,
9446 3507210587u, 928543347u,
9447 4197807526u, 3680046204u,
9448 2766042024u, 2159512867u,
9449 179373257u, 313902234u,
9450 4024837592u, 294795361u,
9451 1622282562u, 647086234u,
9452 2825039429u, 577214736u,
9453 4043412446u, 2426981244u,
9454 1277736097u, 1130129573u,
9455 2601395338u, 995791646u,
9456 36668922u, 3344746679u,
9457 1521532225u, 1645086060u,
9458 2622763015u, 4122335794u,
9459 2936887705u, 494465807u,
9460 2580840343u, 1064648931u,
9461 1247887787u, 2752145076u,
9462 1277612417u, 1249660507u,
9463 2288678613u, 3312498873u,
9464 2459273912u, 4238535494u,
9465 3117488020u, 2571979978u,
9466 2680188909u, 1471227427u,
9467 1616494033u, 633688562u,
9468 2268653416u, 3268237290u,
9469 3021962815u, 1959779970u,
9470 3321382074u, 766642813u,
9471 204429780u, 1323319858u,
9472 3676032891u, 1380896111u,
9473 4030639049u, 3647601207u,
9474 1830028502u, 2830263774u,
9475 1375962216u, 1733961041u,
9476 939765180u, 521947915u,
9477 3903267364u, 497472767u,
9478 1619700946u, 189164145u,
9479 3115593885u, 486382294u,
9480 1262445920u, 4062496162u,
9481 2464795849u, 3770038872u,
9482 4032121374u, 3235740744u,
9483 3757765258u, 1777199847u,
9484 2167243108u, 1912506671u,
9485 4180515317u, 2276864677u,
9486 536034089u, 2384915026u,
9487 162938278u, 1588060152u,
9488 4018349945u, 2504457929u,
9489 841450426u, 2790120722u,
9490 2719983588u, 1471020554u,
9491 1390856732u, 3623212998u,
9492 2506944218u, 1035080801u,
9493 348812127u, 3026631806u,
9494 746483541u, 2342164722u,
9495 122104390u, 4074122771u,
9496 3986865419u, 1674890530u,
9497 3693306023u, 3011542850u,
9498 1294951725u, 899303190u,
9499 3577146915u, 3549160092u,
9500 1241677652u, 4290680005u,
9501 3193053279u, 2029187390u,
9502 3298063095u, 3943068002u,
9503 3946220635u, 2273781461u,
9504 889053698u, 1376304022u,
9505 1486839612u, 2127663659u,
9506 344127443u, 1646681121u,
9507 2780117810u, 2142045764u,
9508 2694572773u, 447810651u,
9509 2185527146u, 2366308558u,
9510 290335413u, 584901173u,
9511 2012370276u, 970504950u,
9512 3258236042u, 2008155560u,
9513 3945579565u, 614796295u,
9514 24452072u, 2695940969u,
9515 3983727134u, 3444688454u,
9516 1327044473u, 3545633451u,
9517 1875293322u, 1739318893u,
9518 1707527799u, 2683090634u,
9519 2848082386u, 2814622471u,
9520 4111401777u, 2774816580u,
9521 3849839194u, 437560100u,
9522 2238350150u, 2462124836u,
9523 665017710u, 512012738u,
9524 2945294779u, 3305170944u,
9525 819477765u, 59419271u,
9526 155125658u, 665292744u,
9527 444722813u, 3580039116u,
9528 2355675635u, 663735032u,
9529 3247800169u, 1579404983u,
9530 1985115003u, 3397891494u,
9531 358696453u, 1474896279u,
9532 516388613u, 710590371u,
9533 3490497111u, 2514565805u,
9534 2386143445u, 477509654u,
9535 412854590u, 3624609754u,
9536 3214388668u, 3516075816u,
9537 2731288520u, 1369482895u,
9538 4033204378u, 1314000850u,
9539 829769325u, 1935166880u,
9540 1608191643u, 2607067237u,
9541 423820371u, 3257747610u,
9542 1355298041u, 3776931214u,
9543 4105054901u, 2107080812u,
9544 1911521879u, 3183054185u,
9545 3910177801u, 675129307u,
9546 1209358971u, 4205727791u,
9547 1435726287u, 3333261712u,
9548 1400982708u, 1154611403u,
9549 1663501483u, 2837596667u,
9550 3164734053u, 2759854023u,
9551 4012043629u, 1963228038u,
9552 3981675284u, 2677557877u,
9553 520119591u, 505138315u,
9554 897271356u, 1803966773u,
9555 1016663294u, 616691903u,
9556 2254742522u, 4032705384u,
9557 2468470796u, 798395739u,
9558 3025169002u, 3570037122u,
9559 1461093710u, 3473799845u,
9560 3702624858u, 476400898u,
9561 1043039728u, 2304070437u,
9562 181576948u, 602972493u,
9563 3996616030u, 3289878097u,
9564 2068516226u, 3922247304u,
9565 1299968266u, 2520311409u,
9566 1968824721u, 3214794876u,
9567 1581813122u, 2668800905u,
9568 3297613974u, 748160407u,
9569 1145536484u, 1326769504u,
9570 2973323521u, 3775262814u,
9571 3218653169u, 902775872u,
9572 3498603433u, 1372805534u,
9573 704686363u, 3626542352u,
9574 2271580579u, 1213925114u,
9575 46329775u, 3009384989u,
9576 1330254048u, 1194824134u,
9577 514204310u, 3781981134u,
9578 442526164u, 2835608783u,
9579 3460471867u, 510634034u,
9580 546406434u, 2716786748u,
9581 2840500021u, 1669490957u,
9582 2536189149u, 3251421224u,
9583 1358736072u, 1089334066u,
9584 3260749330u, 250756920u,
9585 2974806681u, 1513718866u,
9586 82635635u, 4041016629u,
9587 3391765744u, 2495807367u,
9588 3962674316u, 2822889695u,
9589 753413337u, 2008251381u,
9590 3123390177u, 106212622u,
9591 490570565u, 1684884205u,
9592 793892547u, 1927268995u,
9593 2344148164u, 2251978818u,
9594 437424236u, 2774023200u,
9595 2674940754u, 3788056262u,
9596 2597882666u, 3678660147u,
9597 3797434193u, 3838215866u,
9598 279687080u, 2656772270u,
9599 2190204787u, 1997584981u,
9600 3384401882u, 3160208845u,
9601 3629379425u, 2668998785u,
9602 1050036757u, 2954162084u,
9603 917091826u, 1744374041u,
9604 1454282570u, 845687881u,
9605 2997173625u, 776018378u,
9606 1137560602u, 1938378389u,
9607 1748082354u, 2066910012u,
9608 2677675207u, 918315064u,
9609 };
9610
9611 // Return false only if offset is -1 and a spot check of 3 hashes all yield 0.
9612 bool Test(int offset, int len = 0) {
9613 #undef Check
9614 #undef IsAlive
9615
9616 #define Check(x) do { \
9617 const uint32_t actual = (x), e = expected[index++]; \
9618 bool ok = actual == e; \
9619 if (!ok) { \
9620 cerr << "expected " << hex << e << " but got " << actual << endl; \
9621 ++errors; \
9622 } \
9623 assert(ok); \
9624 } while (0)
9625
9626 #define IsAlive(x) do { alive += IsNonZero(x); } while (0)
9627
9628 // After the following line is where the uses of "Check" and such will go.
9629 static int index = 0;
9630 if (offset == -1) { int alive = 0; { uint64_t h = farmhashte::Hash64WithSeeds(da ta, len++, SEED0, SEED1); IsAlive(h >> 32); IsAlive((h << 32) >> 32); } { uint64 _t h = farmhashte::Hash64WithSeed(data, len++, SEED); IsAlive(h >> 32); IsAlive( (h << 32) >> 32); } { uint64_t h = farmhashte::Hash64(data, len++); IsAlive(h >> 32); IsAlive((h << 32) >> 32); } len -= 3; return alive > 0; }
9631 { uint64_t h = farmhashte::Hash64WithSeeds(data + offset, len, SEED0, SEED1); Ch eck(h >> 32); Check((h << 32) >> 32); }
9632 { uint64_t h = farmhashte::Hash64WithSeed(data + offset, len, SEED); Check(h >> 32); Check((h << 32) >> 32); }
9633 { uint64_t h = farmhashte::Hash64(data + offset, len); Check(h >> 32); Check((h << 32) >> 32); }
9634
9635 return true;
9636 #undef Check
9637 #undef IsAlive
9638 }
9639
9640 int RunTest() {
9641 Setup();
9642 int i = 0;
9643 cout << "Running farmhashteTest";
9644 if (!Test(-1)) {
9645 cout << "... Unavailable\n";
9646 return NoteErrors();
9647 }
9648 // Good. The function is attempting to hash, so run the full test.
9649 int errors_prior_to_test = errors;
9650 for ( ; i < kTestSize - 1; i++) {
9651 Test(i * i, i);
9652 }
9653 for ( ; i < kDataSize; i += i / 7) {
9654 Test(0, i);
9655 }
9656 Test(0, kDataSize);
9657 cout << (errors == errors_prior_to_test ? "... OK\n" : "... Failed\n");
9658 return NoteErrors();
9659 }
9660
9661 #else
9662
9663 // After the following line is where the code to print hash codes will go.
9664 void Dump(int offset, int len) {
9665 { uint64_t h = farmhashte::Hash64WithSeeds(data + offset, len, SEED0, SEED1); co ut << (h >> 32) << "u, " << ((h << 32) >> 32) << "u," << endl; }
9666 { uint64_t h = farmhashte::Hash64WithSeed(data + offset, len, SEED); cout << (h >> 32) << "u, " << ((h << 32) >> 32) << "u," << endl; }
9667 { uint64_t h = farmhashte::Hash64(data + offset, len); cout << (h >> 32) << "u, " << ((h << 32) >> 32) << "u," << endl; }
9668 }
9669
9670 #endif
9671
9672 #undef SEED
9673 #undef SEED1
9674 #undef SEED0
9675
9676 } // namespace farmhashteTest
9677
9678 #if TESTING
9679
9680 static int farmhashteTestResult = farmhashteTest::RunTest();
9681
9682 #else
9683 int main(int argc, char** argv) {
9684 Setup();
9685 cout << "uint32_t expected[] = {\n";
9686 int i = 0;
9687 for ( ; i < kTestSize - 1; i++) {
9688 farmhashteTest::Dump(i * i, i);
9689 }
9690 for ( ; i < kDataSize; i += i / 7) {
9691 farmhashteTest::Dump(0, i);
9692 }
9693 farmhashteTest::Dump(0, kDataSize);
9694 cout << "};\n";
9695 }
9696 #endif
9697 #ifndef FARMHASH_SELF_TEST_GUARD
9698 #define FARMHASH_SELF_TEST_GUARD
9699 #include <cstdio>
9700 #include <iostream>
9701 #include <string.h>
9702
9703 using std::cout;
9704 using std::cerr;
9705 using std::endl;
9706 using std::hex;
9707
9708 static const uint64_t kSeed0 = 1234567;
9709 static const uint64_t kSeed1 = k0;
9710 static const int kDataSize = 1 << 20;
9711 static const int kTestSize = 300;
9712 #define kSeed128 Uint128(kSeed0, kSeed1)
9713
9714 static char data[kDataSize];
9715
9716 static int completed_self_tests = 0;
9717 static int errors = 0;
9718
9719 // Initialize data to pseudorandom values.
9720 void Setup() {
9721 if (completed_self_tests == 0) {
9722 uint64_t a = 9;
9723 uint64_t b = 777;
9724 for (int i = 0; i < kDataSize; i++) {
9725 a += b;
9726 b += a;
9727 a = (a ^ (a >> 41)) * k0;
9728 b = (b ^ (b >> 41)) * k0 + i;
9729 uint8_t u = b >> 37;
9730 memcpy(data + i, &u, 1); // uint8_t -> char
9731 }
9732 }
9733 }
9734
9735 int NoteErrors() {
9736 #define NUM_SELF_TESTS 9
9737 if (++completed_self_tests == NUM_SELF_TESTS)
9738 std::exit(errors > 0);
9739 return errors;
9740 }
9741
9742 template <typename T> inline bool IsNonZero(T x) {
9743 return x != 0;
9744 }
9745
9746 template <> inline bool IsNonZero<uint128_t>(uint128_t x) {
9747 return x != Uint128(0, 0);
9748 }
9749
9750 #endif // FARMHASH_SELF_TEST_GUARD
9751
9752 namespace farmhashuoTest {
9753
9754 uint32_t CreateSeed(int offset, int salt) {
9755 uint32_t h = static_cast<uint32_t>(salt & 0xffffffff);
9756 h = h * c1;
9757 h ^= (h >> 17);
9758 h = h * c1;
9759 h ^= (h >> 17);
9760 h = h * c1;
9761 h ^= (h >> 17);
9762 h += static_cast<uint32_t>(offset & 0xffffffff);
9763 h = h * c1;
9764 h ^= (h >> 17);
9765 h = h * c1;
9766 h ^= (h >> 17);
9767 h = h * c1;
9768 h ^= (h >> 17);
9769 return h;
9770 }
9771
9772 #undef SEED
9773 #undef SEED1
9774 #undef SEED0
9775 #define SEED CreateSeed(offset, -1)
9776 #define SEED0 CreateSeed(offset, 0)
9777 #define SEED1 CreateSeed(offset, 1)
9778
9779 #undef TESTING
9780 #define TESTING 1
9781 #if TESTING
9782 uint32_t expected[] = {
9783 3277735313u, 2681724312u,
9784 2598464059u, 797982799u,
9785 2603993599u, 921001710u,
9786 1410420968u, 2134990486u,
9787 2914424215u, 2244477846u,
9788 255297188u, 2992121793u,
9789 161451183u, 3943596029u,
9790 4019337850u, 452431531u,
9791 3379021470u, 2557197665u,
9792 299850021u, 2532580744u,
9793 1298374911u, 3099673830u,
9794 2199864459u, 3696623795u,
9795 4055299123u, 3281581178u,
9796 1053458494u, 1882212500u,
9797 3456121707u, 275903667u,
9798 458884671u, 3033004529u,
9799 1898235244u, 1402319660u,
9800 2700149065u, 2699376854u,
9801 2433714046u, 4222949502u,
9802 4220361840u, 1712034059u,
9803 4148372108u, 1330324210u,
9804 594028478u, 2921867846u,
9805 780716741u, 1728752234u,
9806 3280331829u, 326029180u,
9807 393215742u, 3349570000u,
9808 3824583307u, 1612122221u,
9809 1379537552u, 1646032583u,
9810 2233466664u, 1432476832u,
9811 2052294713u, 3552092450u,
9812 1628777059u, 1499109081u,
9813 2960536756u, 1554038301u,
9814 1145519619u, 3190844552u,
9815 237495366u, 540224401u,
9816 65721842u, 489963606u,
9817 1596489240u, 1562872448u,
9818 1790705123u, 2128624475u,
9819 1435705557u, 1262831810u,
9820 155445229u, 1672724608u,
9821 663607706u, 2077310004u,
9822 3610042449u, 1911523866u,
9823 2563776023u, 294527927u,
9824 1099072299u, 1389770549u,
9825 2952353448u, 2026137563u,
9826 3603803785u, 629449419u,
9827 226132789u, 2489287368u,
9828 1552847036u, 645684964u,
9829 187883449u, 230403464u,
9830 3151491850u, 3272648435u,
9831 2002861219u, 165370827u,
9832 916494250u, 1230085527u,
9833 3807265751u, 3628174014u,
9834 231181488u, 851743255u,
9835 2988893883u, 1554380634u,
9836 1142264800u, 3667013118u,
9837 2638023604u, 2290487377u,
9838 732137533u, 1909203251u,
9839 1380301172u, 1498556724u,
9840 4072067757u, 4165088768u,
9841 3931792696u, 197618179u,
9842 956300927u, 914413116u,
9843 2148126371u, 1913303225u,
9844 3074915312u, 3117299654u,
9845 3178848746u, 1357272220u,
9846 1438494951u, 507436733u,
9847 3854939912u, 1413396341u,
9848 126024219u, 146044391u,
9849 3254014218u, 429095991u,
9850 165589978u, 1578546616u,
9851 623071693u, 366414107u,
9852 249776086u, 1207522198u,
9853 3120876698u, 1684583131u,
9854 46987739u, 1157614300u,
9855 199124911u, 520792961u,
9856 3614377032u, 586863115u,
9857 1716848157u, 4033596884u,
9858 1164298657u, 4140791139u,
9859 3824360466u, 3242407770u,
9860 3725511003u, 232064808u,
9861 2736953692u, 816692935u,
9862 512845449u, 3748861010u,
9863 4290630595u, 517646945u,
9864 22638523u, 648000590u,
9865 1283799121u, 3047062993u,
9866 1024246061u, 4027776454u,
9867 834785312u, 382936554u,
9868 411505255u, 1973395102u,
9869 580988377u, 2826990641u,
9870 3474970689u, 1029055034u,
9871 2584372201u, 1758123094u,
9872 589567754u, 325737734u,
9873 3886113119u, 3338548567u,
9874 257578986u, 3698087965u,
9875 3604937815u, 3198590202u,
9876 2305332220u, 191910725u,
9877 4244322689u, 542201663u,
9878 3315355162u, 2135941665u,
9879 1175961330u, 3948351189u,
9880 23075771u, 3252374102u,
9881 713127376u, 1467786451u,
9882 663013031u, 3444053918u,
9883 3077742128u, 1062268187u,
9884 2115441882u, 4081398201u,
9885 2335576331u, 2560479831u,
9886 1379288194u, 4225182569u,
9887 3958366652u, 3067277639u,
9888 3667516477u, 1709989541u,
9889 4188504038u, 59581167u,
9890 2725013602u, 3639843023u,
9891 3758739543u, 4189944477u,
9892 2470483982u, 877580602u,
9893 3252925478u, 2062343506u,
9894 3981838403u, 3762572073u,
9895 2931588131u, 3284356565u,
9896 1129162571u, 732225574u,
9897 1677744031u, 3532596884u,
9898 3232041815u, 1652884780u,
9899 3740979556u, 259034107u,
9900 2227121257u, 1426140634u,
9901 315836068u, 3200749877u,
9902 1386256573u, 24035717u,
9903 234531934u, 1115203611u,
9904 1598686658u, 3146815575u,
9905 2632963283u, 1778459926u,
9906 739944537u, 579625482u,
9907 1231665285u, 2457048126u,
9908 3903349120u, 389846205u,
9909 1052645068u, 862072556u,
9910 2834153464u, 1481069623u,
9911 1688445808u, 701920051u,
9912 3740748788u, 3388062747u,
9913 1192588249u, 1410111809u,
9914 2633463887u, 4050419847u,
9915 2513844237u, 2187968410u,
9916 2951683019u, 3015806005u,
9917 3000537321u, 479241367u,
9918 252167538u, 1231057113u,
9919 393624922u, 704325635u,
9920 1467197045u, 2066433573u,
9921 3082385053u, 735688735u,
9922 956434529u, 4028590195u,
9923 4074716319u, 813690332u,
9924 2124740535u, 804073145u,
9925 3748881891u, 3195309868u,
9926 841856605u, 2585865274u,
9927 881504822u, 3254795114u,
9928 1241815736u, 970796142u,
9929 497175391u, 3929484338u,
9930 4264993211u, 1835322201u,
9931 3675707838u, 4205965408u,
9932 300298607u, 3858319990u,
9933 3255259608u, 4247675634u,
9934 1095823272u, 1197245408u,
9935 1742785722u, 785893184u,
9936 1702965674u, 850401405u,
9937 4084891412u, 1160134629u,
9938 2555998391u, 1972759056u,
9939 710625654u, 4116162021u,
9940 3352753742u, 85121177u,
9941 3513255468u, 2487440590u,
9942 2480032715u, 2287747045u,
9943 4090178629u, 4044418876u,
9944 1703944517u, 486290428u,
9945 1515601363u, 2011102035u,
9946 573985957u, 3536053779u,
9947 4257172787u, 576405853u,
9948 1523550693u, 1014952061u,
9949 711098718u, 2425317635u,
9950 3460807169u, 3688987163u,
9951 3167371443u, 3062418115u,
9952 3330028292u, 1713171303u,
9953 526177822u, 2602636307u,
9954 1245357025u, 3346699703u,
9955 254529415u, 4017058800u,
9956 1829738451u, 2164236533u,
9957 1381258384u, 4036354071u,
9958 1749181924u, 4118435443u,
9959 4130543625u, 688472265u,
9960 2731071299u, 2547657502u,
9961 4175776103u, 338058159u,
9962 3729582129u, 4181845558u,
9963 2227290760u, 146827036u,
9964 2459178427u, 1025353883u,
9965 4284109679u, 2502815838u,
9966 825124804u, 2533140036u,
9967 616327404u, 2448966429u,
9968 413992636u, 2334782461u,
9969 2239052397u, 1082330589u,
9970 3381164715u, 199381437u,
9971 2583939798u, 2848283092u,
9972 2300168091u, 2156336315u,
9973 1855234968u, 1982110346u,
9974 2482046810u, 3158163887u,
9975 2168864636u, 133643215u,
9976 3904021624u, 3646514568u,
9977 1176127003u, 4015671361u,
9978 100525019u, 3534706803u,
9979 2045051700u, 3452457457u,
9980 1492267772u, 2308393828u,
9981 3776661467u, 3281002516u,
9982 4246334524u, 743955039u,
9983 685631442u, 1147951686u,
9984 2040912376u, 2911148054u,
9985 3204999386u, 2415262714u,
9986 313209105u, 777065474u,
9987 2729416454u, 1029284767u,
9988 1632078298u, 1817552554u,
9989 3963877000u, 1919171906u,
9990 3843219958u, 3073580867u,
9991 865146997u, 2473524405u,
9992 2593817617u, 3643076308u,
9993 617975720u, 3671562289u,
9994 121812599u, 2902367378u,
9995 2260041112u, 1019936943u,
9996 320945955u, 2337845588u,
9997 1535670711u, 773792826u,
9998 3152195900u, 4090794518u,
9999 4142587430u, 484732447u,
10000 419191319u, 3377973345u,
10001 324924679u, 2809286837u,
10002 1562277603u, 1378362199u,
10003 3791551981u, 1097806406u,
10004 1386297408u, 2304900033u,
10005 3574135531u, 4017075736u,
10006 1161238398u, 1358056883u,
10007 3487080616u, 1516736273u,
10008 851615042u, 2927899494u,
10009 4077452507u, 2984955003u,
10010 3907754394u, 3578173844u,
10011 1948409509u, 1923531348u,
10012 3578472493u, 3710074193u,
10013 213811117u, 2586632018u,
10014 1922589216u, 274958014u,
10015 1654276320u, 2687561076u,
10016 2569061755u, 3122046057u,
10017 3203802620u, 1692079268u,
10018 477806878u, 140587742u,
10019 520565830u, 3674576684u,
10020 91246882u, 1010215946u,
10021 3703994407u, 69201295u,
10022 776213083u, 3677771507u,
10023 3696902571u, 3593730713u,
10024 2907901228u, 3239753796u,
10025 1586241476u, 1939595371u,
10026 2268396558u, 3468719670u,
10027 2955715987u, 2295501078u,
10028 2775848696u, 1358532390u,
10029 3843660102u, 82177963u,
10030 4094477877u, 191727221u,
10031 278661677u, 2889101923u,
10032 1352525614u, 2844977667u,
10033 1261140657u, 1747052377u,
10034 2334120653u, 645125282u,
10035 2707230761u, 4142246789u,
10036 1068639717u, 2288162940u,
10037 1419293714u, 1636932722u,
10038 3252686293u, 318543902u,
10039 2598802768u, 2025886508u,
10040 2250788464u, 2711763065u,
10041 255108733u, 1845587644u,
10042 3719270134u, 3940707863u,
10043 917608574u, 1363253259u,
10044 788659330u, 673256220u,
10045 109793386u, 341851980u,
10046 2698465479u, 3011229884u,
10047 3886713057u, 1276595523u,
10048 2439962760u, 2700515456u,
10049 205970448u, 4198897105u,
10050 875511891u, 371715572u,
10051 1033680610u, 4278599955u,
10052 3120038721u, 1256300069u,
10053 225629455u, 3735275001u,
10054 3961944123u, 1769389163u,
10055 1074553219u, 668829411u,
10056 1098679359u, 2573697509u,
10057 1885071395u, 4233785523u,
10058 2513878053u, 2030193788u,
10059 360256231u, 107312677u,
10060 310517502u, 2618936366u,
10061 3600462351u, 1216645846u,
10062 2970730323u, 4278812598u,
10063 94638678u, 1689811113u,
10064 4125738800u, 3103759730u,
10065 103797041u, 1397772514u,
10066 1669653333u, 572567964u,
10067 1612872497u, 2986430557u,
10068 214990655u, 3117607990u,
10069 1949717207u, 2260498180u,
10070 1493936866u, 3554860960u,
10071 1582022990u, 1263709570u,
10072 1244120487u, 3416600761u,
10073 224580012u, 4252610345u,
10074 286306391u, 814956796u,
10075 1820532305u, 2776960536u,
10076 3082703465u, 1659265982u,
10077 1157398049u, 3752806924u,
10078 3508246460u, 2902716664u,
10079 2110942730u, 3267551635u,
10080 902835431u, 405228165u,
10081 2341378668u, 2220373824u,
10082 3303626294u, 1175118221u,
10083 383517064u, 896322512u,
10084 1697257567u, 2202820683u,
10085 1837689083u, 1336556841u,
10086 914535232u, 3634083711u,
10087 1537187340u, 3712582785u,
10088 1088201893u, 3270984620u,
10089 3093195926u, 2561488770u,
10090 1962968100u, 236189500u,
10091 2549435227u, 536047554u,
10092 422609195u, 2958815818u,
10093 4166184983u, 3528794619u,
10094 1042329086u, 3914176886u,
10095 1359641525u, 1197100813u,
10096 1269739674u, 3301844628u,
10097 1831223342u, 3329594980u,
10098 2433669782u, 494908536u,
10099 1441714797u, 1174785921u,
10100 1933050423u, 958901065u,
10101 868981704u, 2163330264u,
10102 3243110680u, 1443133429u,
10103 1145009669u, 2520062970u,
10104 3851564853u, 2664619323u,
10105 2686075657u, 4042710240u,
10106 2125408249u, 4165697916u,
10107 2328730865u, 3160666939u,
10108 588683409u, 2126275847u,
10109 829404209u, 1878067032u,
10110 2567792910u, 897670516u,
10111 934312076u, 2952135524u,
10112 504832490u, 3312698056u,
10113 4015478120u, 1265237690u,
10114 3376133707u, 967674402u,
10115 1553513184u, 834830418u,
10116 2396504772u, 3278582098u,
10117 2950762705u, 4277111759u,
10118 4159211303u, 1290097509u,
10119 251949572u, 3065234219u,
10120 1832020534u, 312136369u,
10121 1103404394u, 198182691u,
10122 1369599600u, 3906710870u,
10123 2954651680u, 1535115487u,
10124 2389327507u, 1813520230u,
10125 632704095u, 140762681u,
10126 3123202913u, 3336005523u,
10127 1287729497u, 2198985327u,
10128 2470730783u, 3821758006u,
10129 1009870118u, 559702706u,
10130 4274686257u, 3187546567u,
10131 2402308151u, 1096697687u,
10132 678932329u, 3716363135u,
10133 2899950405u, 3046872820u,
10134 3754655641u, 2021741414u,
10135 1993425202u, 2185339100u,
10136 2838253700u, 3099212100u,
10137 1679617763u, 3703603898u,
10138 1135665833u, 3559875668u,
10139 2503579743u, 1446869792u,
10140 879818611u, 3788305533u,
10141 2879018745u, 2719373510u,
10142 3606051203u, 2166567748u,
10143 343595772u, 1996164093u,
10144 1577656121u, 475248376u,
10145 463852893u, 2864244470u,
10146 1332049663u, 3326459767u,
10147 3207234525u, 2028708916u,
10148 938916154u, 3115246264u,
10149 3272166407u, 557660441u,
10150 1265684026u, 245033807u,
10151 2440657523u, 255451671u,
10152 3811885130u, 1399880284u,
10153 1322855877u, 3452203069u,
10154 1324994449u, 3796404024u,
10155 2002090272u, 1568745354u,
10156 3700047753u, 31799506u,
10157 3009412313u, 3184047862u,
10158 728680761u, 3848624873u,
10159 1849329144u, 3160134214u,
10160 1272923193u, 1474278816u,
10161 1208883495u, 1566527339u,
10162 4136466541u, 630825649u,
10163 1717327230u, 1496132623u,
10164 2449386742u, 128106940u,
10165 2108574735u, 2584236470u,
10166 2872246579u, 397338552u,
10167 3088905079u, 3456882941u,
10168 1715915153u, 2940716269u,
10169 4168438718u, 467441309u,
10170 872996731u, 3206901319u,
10171 1610606159u, 2540270567u,
10172 1301658081u, 2379410194u,
10173 2109315753u, 3348545480u,
10174 2041927873u, 2644077493u,
10175 546596661u, 1017047954u,
10176 2596792972u, 2783958892u,
10177 2826408201u, 3531646869u,
10178 2219352672u, 4217451852u,
10179 1806867885u, 1903578924u,
10180 2076465705u, 2373061493u,
10181 1832925325u, 241574049u,
10182 1509517110u, 3703614272u,
10183 3429894862u, 3529565564u,
10184 4010000614u, 2256197939u,
10185 517086873u, 2964595704u,
10186 3501035294u, 4079457298u,
10187 1184683823u, 4260564140u,
10188 2339268412u, 3871564102u,
10189 1572637805u, 383233885u,
10190 3351411126u, 3419328182u,
10191 2017406667u, 919677938u,
10192 29804156u, 46276077u,
10193 3032591014u, 4204155962u,
10194 1172319502u, 969309871u,
10195 2211319468u, 4153726847u,
10196 3094193193u, 4240669441u,
10197 3441709766u, 1387233546u,
10198 4048882438u, 1217896566u,
10199 1580964938u, 740563169u,
10200 3691850348u, 3176426539u,
10201 2738323042u, 2948665536u,
10202 1474029445u, 3513354882u,
10203 3219466255u, 3799363969u,
10204 3961796122u, 1055550923u,
10205 1992212097u, 2263421398u,
10206 4289759174u, 2516844140u,
10207 1782515131u, 2746577402u,
10208 721928440u, 3529570984u,
10209 1705302106u, 768287270u,
10210 3474902815u, 4000011125u,
10211 3475618043u, 212490675u,
10212 549130471u, 2970128275u,
10213 3170016833u, 2549835613u,
10214 3691104824u, 2694324482u,
10215 4169365948u, 3738062408u,
10216 602930397u, 2148954730u,
10217 2636387819u, 2616619070u,
10218 301617872u, 374657036u,
10219 3862686086u, 431292293u,
10220 4225245165u, 1358580562u,
10221 2377363130u, 1415970351u,
10222 3885060756u, 1438379807u,
10223 2297418515u, 2954777083u,
10224 3970368221u, 1229801760u,
10225 1931934525u, 2287507921u,
10226 1713471510u, 2145608111u,
10227 2650140034u, 4081586725u,
10228 4196863572u, 1896558394u,
10229 4059852729u, 1813855658u,
10230 2618400836u, 1396056469u,
10231 2375584220u, 1037031473u,
10232 249284003u, 2450077637u,
10233 1383747654u, 3122687303u,
10234 2664431743u, 3855028730u,
10235 929335420u, 3193251135u,
10236 137313762u, 1850894384u,
10237 3163711272u, 3071568023u,
10238 418541677u, 3621223039u,
10239 340274176u, 1167681812u,
10240 4106647531u, 4022465625u,
10241 3069708839u, 2704165015u,
10242 2332023349u, 641449034u,
10243 921552000u, 1712976649u,
10244 1876484273u, 2343049860u,
10245 1834682077u, 4155949943u,
10246 2061821157u, 4240649383u,
10247 747285578u, 1626463554u,
10248 165503115u, 359629739u,
10249 3838102563u, 582664250u,
10250 3878924635u, 4117237498u,
10251 2250573853u, 804336148u,
10252 331393443u, 4242530387u,
10253 3346357270u, 1674051445u,
10254 3348019777u, 1722242971u,
10255 2509017299u, 2966108111u,
10256 4189102509u, 3323592310u,
10257 2631381069u, 4014551783u,
10258 4250787412u, 3448394212u,
10259 2664752123u, 3517585534u,
10260 3605365141u, 1669471183u,
10261 2210121140u, 760762191u,
10262 249697459u, 3416920106u,
10263 16322182u, 643179562u,
10264 1564226597u, 2134630675u,
10265 1011990087u, 2990167340u,
10266 2349550842u, 1642428946u,
10267 1214854475u, 2134299399u,
10268 2704221532u, 2104175211u,
10269 4283196353u, 1342880802u,
10270 198529755u, 2004468390u,
10271 2544665755u, 853593042u,
10272 2090611294u, 2970943872u,
10273 1472073141u, 850464484u,
10274 1407609278u, 3062461105u,
10275 366448238u, 3842907484u,
10276 488797416u, 1432670231u,
10277 294963924u, 3693536939u,
10278 3390549825u, 1583234720u,
10279 4032223840u, 2318423400u,
10280 2965642867u, 930822729u,
10281 1679099863u, 1728968857u,
10282 900822335u, 702309817u,
10283 3258354115u, 1502282913u,
10284 2811888503u, 3924947660u,
10285 2477280726u, 3651607391u,
10286 3788310204u, 1300369123u,
10287 1842333726u, 4146839064u,
10288 2468893861u, 4091095953u,
10289 488595746u, 1448097974u,
10290 1159634090u, 1738834113u,
10291 2928916831u, 4093725287u,
10292 530850094u, 291657799u,
10293 3548184546u, 679517009u,
10294 399175380u, 2658337143u,
10295 3827951761u, 3086277222u,
10296 2067718397u, 3632376023u,
10297 3553313841u, 119173722u,
10298 1702434637u, 1766260771u,
10299 895654784u, 751439914u,
10300 4008409498u, 215917713u,
10301 1288382231u, 2656990891u,
10302 2581779077u, 1570750352u,
10303 2666411616u, 3533987737u,
10304 4289478316u, 3576119563u,
10305 3869794273u, 963183826u,
10306 2081410737u, 3796810515u,
10307 1036883117u, 136547246u,
10308 875691100u, 2592925324u,
10309 2689342539u, 427154472u,
10310 532957601u, 1228758574u,
10311 1908591042u, 1464255968u,
10312 446980910u, 2984611177u,
10313 3508927906u, 2001585786u,
10314 2544767379u, 1525438381u,
10315 879448844u, 1348536411u,
10316 4242243590u, 2861338018u,
10317 601175800u, 764077711u,
10318 530635011u, 3785343245u,
10319 2378297261u, 457568934u,
10320 76438221u, 4104954272u,
10321 2485968477u, 2381948487u,
10322 4226929450u, 3148473363u,
10323 879369091u, 2180270337u,
10324 3674375989u, 1387729170u,
10325 568650985u, 951677556u,
10326 4213877384u, 2721005055u,
10327 1678669911u, 66786703u,
10328 2273631661u, 1149351924u,
10329 246723096u, 1895026827u,
10330 3810605772u, 3711056516u,
10331 2080120290u, 3638638708u,
10332 2915672708u, 2263003308u,
10333 1976115991u, 3448840877u,
10334 2019238520u, 225333538u,
10335 1555273378u, 3797521928u,
10336 1942347150u, 3262952567u,
10337 2817830907u, 2078619498u,
10338 749534111u, 1178073973u,
10339 841092198u, 3288261538u,
10340 1696412169u, 1496966875u,
10341 3739946319u, 2481012988u,
10342 568983526u, 114945840u,
10343 2841706923u, 1632780103u,
10344 4020169654u, 2087949619u,
10345 833416317u, 3787017905u,
10346 2373238993u, 2575395164u,
10347 2542976862u, 2971726178u,
10348 2880371864u, 3642087909u,
10349 1043714217u, 3894199764u,
10350 2235879182u, 203853421u,
10351 834683330u, 425935223u,
10352 3560796393u, 3565833278u,
10353 3414330886u, 1748785729u,
10354 1023171602u, 580966986u,
10355 2657385925u, 2124704694u,
10356 233442446u, 1107045577u,
10357 3899097693u, 1067532701u,
10358 115667924u, 1406028344u,
10359 2419657149u, 18613994u,
10360 2532882091u, 3476683808u,
10361 895961699u, 3762914298u,
10362 1328752423u, 1844996900u,
10363 1210281744u, 904215228u,
10364 4055325594u, 1118521573u,
10365 3996647489u, 3657647605u,
10366 325254059u, 3136157065u,
10367 3341068436u, 2287683323u,
10368 1313073005u, 126005630u,
10369 853746559u, 3555092974u,
10370 2689238752u, 49515858u,
10371 61073168u, 1010661841u,
10372 1269521335u, 1902040126u,
10373 3858321250u, 1400735275u,
10374 2974699176u, 2771676666u,
10375 545726212u, 2225229957u,
10376 1086473152u, 3454177594u,
10377 2088002891u, 2883475137u,
10378 3222194252u, 4144472319u,
10379 567988835u, 1051332394u,
10380 3932046135u, 542648229u,
10381 162888005u, 1669710469u,
10382 1492500905u, 553041029u,
10383 3817492747u, 584127807u,
10384 4147115982u, 2993670925u,
10385 3509733475u, 3587959456u,
10386 2088550465u, 1745399498u,
10387 869648362u, 1404723176u,
10388 3947542735u, 1334333531u,
10389 59634866u, 3239516985u,
10390 3844250972u, 1275954779u,
10391 2512155003u, 1685649437u,
10392 639306006u, 2524620206u,
10393 576786501u, 655707039u,
10394 2864351838u, 3736264674u,
10395 1200907897u, 2384379464u,
10396 15823708u, 206117476u,
10397 1193310960u, 1093099415u,
10398 3696538026u, 4112584792u,
10399 2069527017u, 547588820u,
10400 4178147211u, 2827259351u,
10401 940846775u, 1054995047u,
10402 2976960697u, 1934305529u,
10403 2199137382u, 1005722394u,
10404 1875867180u, 2064356511u,
10405 4019734130u, 3096333006u,
10406 2069509024u, 2906358341u,
10407 2232866485u, 1456016086u,
10408 1422674894u, 867282151u,
10409 1612503136u, 1739843072u,
10410 134947567u, 2978775774u,
10411 1284167756u, 1090844589u,
10412 831688783u, 2079216362u,
10413 1626991196u, 3644714163u,
10414 3678110059u, 898470030u,
10415 3916646913u, 3182422972u,
10416 3630426828u, 969847973u,
10417 3427164640u, 3463937250u,
10418 3044785046u, 897322257u,
10419 3443872170u, 4185408854u,
10420 2557463241u, 4080940424u,
10421 2048168570u, 2429169982u,
10422 3174690447u, 2513494106u,
10423 1213061732u, 3143736628u,
10424 3482268149u, 1250714337u,
10425 31648125u, 3872383625u,
10426 1565760579u, 36665130u,
10427 751041229u, 2257179590u,
10428 2915361862u, 280819225u,
10429 2907818413u, 4254297769u,
10430 3493178615u, 3755944354u,
10431 4043533423u, 1134196225u,
10432 4177134659u, 127246419u,
10433 2442615581u, 923049607u,
10434 1004426206u, 782768297u,
10435 2410586681u, 1430106871u,
10436 4103323427u, 3168399477u,
10437 3716682375u, 3616334719u,
10438 3413209549u, 656672786u,
10439 2876965944u, 182894450u,
10440 456581318u, 2683752067u,
10441 3877875910u, 3190666241u,
10442 3240336907u, 4024807233u,
10443 1681224377u, 1576191191u,
10444 3599250276u, 2381111980u,
10445 3495321877u, 3956024585u,
10446 1611608524u, 3815677453u,
10447 2062334396u, 1656117707u,
10448 5457134u, 3234118251u,
10449 470187419u, 2688566989u,
10450 3259870297u, 660100446u,
10451 442236198u, 2542452448u,
10452 493137955u, 392411099u,
10453 947967568u, 1234595917u,
10454 4230082284u, 2762976773u,
10455 2870085764u, 1455086530u,
10456 2762099647u, 4011882747u,
10457 1215981925u, 3227517889u,
10458 3269061963u, 4037515364u,
10459 3168911474u, 4255057396u,
10460 2026092260u, 1736192508u,
10461 3909727042u, 3114708966u,
10462 1938800693u, 680793595u,
10463 1525265867u, 2808224480u,
10464 2122290603u, 1211197714u,
10465 3520488321u, 3979192396u,
10466 3540779343u, 4192918639u,
10467 2736030448u, 1120335563u,
10468 1698949078u, 3993310631u,
10469 1966048551u, 2228221363u,
10470 597941119u, 3498018399u,
10471 393987327u, 454500547u,
10472 1222959566u, 567151340u,
10473 3774764786u, 1492844524u,
10474 3308300614u, 805568076u,
10475 868414882u, 177406999u,
10476 1608110313u, 642061169u,
10477 1027515771u, 3131251981u,
10478 2851936150u, 4272755262u,
10479 1532845092u, 709643652u,
10480 682573592u, 1244104217u,
10481 796769556u, 2500467040u,
10482 3002618826u, 1112998535u,
10483 1780193104u, 1243644607u,
10484 3691719535u, 2958853053u,
10485 466635014u, 2277292580u,
10486 4082276003u, 1030800045u,
10487 1750863246u, 379050598u,
10488 3576413281u, 731493104u,
10489 132259176u, 4115195437u,
10490 1769890695u, 2715470335u,
10491 1819263183u, 2028531518u,
10492 2154809766u, 3672399742u,
10493 76727603u, 4198182186u,
10494 2304993586u, 1666387627u,
10495 284366017u, 3359785538u,
10496 3469807328u, 2926494787u,
10497 3829072836u, 2493478921u,
10498 3738499303u, 3311304980u,
10499 932916545u, 2235559063u,
10500 2909742396u, 1765719309u,
10501 1456588655u, 508290328u,
10502 1490719640u, 3356513470u,
10503 2908490783u, 251085588u,
10504 830410677u, 3172220325u,
10505 3897208579u, 1940535730u,
10506 151909546u, 2384458112u,
10507 };
10508
10509 // Return false only if offset is -1 and a spot check of 3 hashes all yield 0.
10510 bool Test(int offset, int len = 0) {
10511 #undef Check
10512 #undef IsAlive
10513
10514 #define Check(x) do { \
10515 const uint32_t actual = (x), e = expected[index++]; \
10516 bool ok = actual == e; \
10517 if (!ok) { \
10518 cerr << "expected " << hex << e << " but got " << actual << endl; \
10519 ++errors; \
10520 } \
10521 assert(ok); \
10522 } while (0)
10523
10524 #define IsAlive(x) do { alive += IsNonZero(x); } while (0)
10525
10526 // After the following line is where the uses of "Check" and such will go.
10527 static int index = 0;
10528 if (offset == -1) { int alive = 0; { uint64_t h = farmhashuo::Hash64WithSeed(dat a, len++, SEED); IsAlive(h >> 32); IsAlive((h << 32) >> 32); } { uint64_t h = fa rmhashuo::Hash64(data, len++); IsAlive(h >> 32); IsAlive((h << 32) >> 32); } { u int64_t h = farmhashuo::Hash64(data, len++); IsAlive(h >> 32); IsAlive((h << 32) >> 32); } len -= 3; return alive > 0; }
10529 { uint64_t h = farmhashuo::Hash64WithSeed(data + offset, len, SEED); Check(h >> 32); Check((h << 32) >> 32); }
10530 { uint64_t h = farmhashuo::Hash64(data + offset, len); Check(h >> 32); Check((h << 32) >> 32); }
10531
10532 return true;
10533 #undef Check
10534 #undef IsAlive
10535 }
10536
10537 int RunTest() {
10538 Setup();
10539 int i = 0;
10540 cout << "Running farmhashuoTest";
10541 if (!Test(-1)) {
10542 cout << "... Unavailable\n";
10543 return NoteErrors();
10544 }
10545 // Good. The function is attempting to hash, so run the full test.
10546 int errors_prior_to_test = errors;
10547 for ( ; i < kTestSize - 1; i++) {
10548 Test(i * i, i);
10549 }
10550 for ( ; i < kDataSize; i += i / 7) {
10551 Test(0, i);
10552 }
10553 Test(0, kDataSize);
10554 cout << (errors == errors_prior_to_test ? "... OK\n" : "... Failed\n");
10555 return NoteErrors();
10556 }
10557
10558 #else
10559
10560 // After the following line is where the code to print hash codes will go.
10561 void Dump(int offset, int len) {
10562 { uint64_t h = farmhashuo::Hash64WithSeed(data + offset, len, SEED); cout << (h >> 32) << "u, " << ((h << 32) >> 32) << "u," << endl; }
10563 { uint64_t h = farmhashuo::Hash64(data + offset, len); cout << (h >> 32) << "u, " << ((h << 32) >> 32) << "u," << endl; }
10564 }
10565
10566 #endif
10567
10568 #undef SEED
10569 #undef SEED1
10570 #undef SEED0
10571
10572 } // namespace farmhashuoTest
10573
10574 #if TESTING
10575
10576 static int farmhashuoTestResult = farmhashuoTest::RunTest();
10577
10578 #else
10579 int main(int argc, char** argv) {
10580 Setup();
10581 cout << "uint32_t expected[] = {\n";
10582 int i = 0;
10583 for ( ; i < kTestSize - 1; i++) {
10584 farmhashuoTest::Dump(i * i, i);
10585 }
10586 for ( ; i < kDataSize; i += i / 7) {
10587 farmhashuoTest::Dump(0, i);
10588 }
10589 farmhashuoTest::Dump(0, kDataSize);
10590 cout << "};\n";
10591 }
10592 #endif
10593 #ifndef FARMHASH_SELF_TEST_GUARD
10594 #define FARMHASH_SELF_TEST_GUARD
10595 #include <cstdio>
10596 #include <iostream>
10597 #include <string.h>
10598
10599 using std::cout;
10600 using std::cerr;
10601 using std::endl;
10602 using std::hex;
10603
10604 static const uint64_t kSeed0 = 1234567;
10605 static const uint64_t kSeed1 = k0;
10606 static const int kDataSize = 1 << 20;
10607 static const int kTestSize = 300;
10608 #define kSeed128 Uint128(kSeed0, kSeed1)
10609
10610 static char data[kDataSize];
10611
10612 static int completed_self_tests = 0;
10613 static int errors = 0;
10614
10615 // Initialize data to pseudorandom values.
10616 void Setup() {
10617 if (completed_self_tests == 0) {
10618 uint64_t a = 9;
10619 uint64_t b = 777;
10620 for (int i = 0; i < kDataSize; i++) {
10621 a += b;
10622 b += a;
10623 a = (a ^ (a >> 41)) * k0;
10624 b = (b ^ (b >> 41)) * k0 + i;
10625 uint8_t u = b >> 37;
10626 memcpy(data + i, &u, 1); // uint8_t -> char
10627 }
10628 }
10629 }
10630
10631 int NoteErrors() {
10632 #define NUM_SELF_TESTS 9
10633 if (++completed_self_tests == NUM_SELF_TESTS)
10634 std::exit(errors > 0);
10635 return errors;
10636 }
10637
10638 template <typename T> inline bool IsNonZero(T x) {
10639 return x != 0;
10640 }
10641
10642 template <> inline bool IsNonZero<uint128_t>(uint128_t x) {
10643 return x != Uint128(0, 0);
10644 }
10645
10646 #endif // FARMHASH_SELF_TEST_GUARD
10647
10648 namespace farmhashxoTest {
10649
10650 uint32_t CreateSeed(int offset, int salt) {
10651 uint32_t h = static_cast<uint32_t>(salt & 0xffffffff);
10652 h = h * c1;
10653 h ^= (h >> 17);
10654 h = h * c1;
10655 h ^= (h >> 17);
10656 h = h * c1;
10657 h ^= (h >> 17);
10658 h += static_cast<uint32_t>(offset & 0xffffffff);
10659 h = h * c1;
10660 h ^= (h >> 17);
10661 h = h * c1;
10662 h ^= (h >> 17);
10663 h = h * c1;
10664 h ^= (h >> 17);
10665 return h;
10666 }
10667
10668 #undef SEED
10669 #undef SEED1
10670 #undef SEED0
10671 #define SEED CreateSeed(offset, -1)
10672 #define SEED0 CreateSeed(offset, 0)
10673 #define SEED1 CreateSeed(offset, 1)
10674
10675 #undef TESTING
10676 #define TESTING 1
10677 #if TESTING
10678 uint32_t expected[] = {
10679 1140953930u, 861465670u,
10680 3277735313u, 2681724312u,
10681 2598464059u, 797982799u,
10682 890626835u, 800175912u,
10683 2603993599u, 921001710u,
10684 1410420968u, 2134990486u,
10685 3283896453u, 1867689945u,
10686 2914424215u, 2244477846u,
10687 255297188u, 2992121793u,
10688 1110588164u, 4186314283u,
10689 161451183u, 3943596029u,
10690 4019337850u, 452431531u,
10691 283198166u, 2741341286u,
10692 3379021470u, 2557197665u,
10693 299850021u, 2532580744u,
10694 452473466u, 1706958772u,
10695 1298374911u, 3099673830u,
10696 2199864459u, 3696623795u,
10697 236935126u, 2976578695u,
10698 4055299123u, 3281581178u,
10699 1053458494u, 1882212500u,
10700 2305012065u, 2169731866u,
10701 3456121707u, 275903667u,
10702 458884671u, 3033004529u,
10703 3058973506u, 2379411653u,
10704 1898235244u, 1402319660u,
10705 2700149065u, 2699376854u,
10706 147814787u, 720739346u,
10707 2433714046u, 4222949502u,
10708 4220361840u, 1712034059u,
10709 3425469811u, 3690733394u,
10710 4148372108u, 1330324210u,
10711 594028478u, 2921867846u,
10712 1635026870u, 192883107u,
10713 780716741u, 1728752234u,
10714 3280331829u, 326029180u,
10715 3969463346u, 1436364519u,
10716 393215742u, 3349570000u,
10717 3824583307u, 1612122221u,
10718 2859809759u, 3808705738u,
10719 1379537552u, 1646032583u,
10720 2233466664u, 1432476832u,
10721 4023053163u, 2650381482u,
10722 2052294713u, 3552092450u,
10723 1628777059u, 1499109081u,
10724 3476440786u, 3829307897u,
10725 2960536756u, 1554038301u,
10726 1145519619u, 3190844552u,
10727 2902102606u, 3600725550u,
10728 237495366u, 540224401u,
10729 65721842u, 489963606u,
10730 1448662590u, 397635823u,
10731 1596489240u, 1562872448u,
10732 1790705123u, 2128624475u,
10733 180854224u, 2604346966u,
10734 1435705557u, 1262831810u,
10735 155445229u, 1672724608u,
10736 1669465176u, 1341975128u,
10737 663607706u, 2077310004u,
10738 3610042449u, 1911523866u,
10739 1043692997u, 1454396064u,
10740 2563776023u, 294527927u,
10741 1099072299u, 1389770549u,
10742 703505868u, 678706990u,
10743 2952353448u, 2026137563u,
10744 3603803785u, 629449419u,
10745 1933894405u, 3043213226u,
10746 226132789u, 2489287368u,
10747 1552847036u, 645684964u,
10748 3828089804u, 3632594520u,
10749 187883449u, 230403464u,
10750 3151491850u, 3272648435u,
10751 3729087873u, 1303930448u,
10752 2002861219u, 165370827u,
10753 916494250u, 1230085527u,
10754 3103338579u, 3064290191u,
10755 3807265751u, 3628174014u,
10756 231181488u, 851743255u,
10757 2295806711u, 1781190011u,
10758 2988893883u, 1554380634u,
10759 1142264800u, 3667013118u,
10760 1968445277u, 315203929u,
10761 2638023604u, 2290487377u,
10762 732137533u, 1909203251u,
10763 440398219u, 1891630171u,
10764 1380301172u, 1498556724u,
10765 4072067757u, 4165088768u,
10766 4204318635u, 441430649u,
10767 3931792696u, 197618179u,
10768 956300927u, 914413116u,
10769 3010839769u, 2837339569u,
10770 2148126371u, 1913303225u,
10771 3074915312u, 3117299654u,
10772 4139181436u, 2993479124u,
10773 3178848746u, 1357272220u,
10774 1438494951u, 507436733u,
10775 667183474u, 2084369203u,
10776 3854939912u, 1413396341u,
10777 126024219u, 146044391u,
10778 1016656857u, 3022024459u,
10779 3254014218u, 429095991u,
10780 990500595u, 3056862311u,
10781 985653208u, 1718653828u,
10782 623071693u, 366414107u,
10783 1771289760u, 2293458109u,
10784 3047342438u, 2991127487u,
10785 3120876698u, 1684583131u,
10786 3638043310u, 1170404994u,
10787 863214540u, 1087193030u,
10788 199124911u, 520792961u,
10789 3169775996u, 1577421232u,
10790 3331828431u, 1013201099u,
10791 1716848157u, 4033596884u,
10792 1770708857u, 4229339322u,
10793 1146169032u, 1434258493u,
10794 3824360466u, 3242407770u,
10795 1926419493u, 2649785113u,
10796 872586426u, 762243036u,
10797 2736953692u, 816692935u,
10798 1571283333u, 3555213933u,
10799 2266795890u, 3781899767u,
10800 4290630595u, 517646945u,
10801 3006163611u, 2180594090u,
10802 959214578u, 558910384u,
10803 1283799121u, 3047062993u,
10804 3830962609u, 2391606125u,
10805 3544509313u, 622325861u,
10806 834785312u, 382936554u,
10807 1421463872u, 788479970u,
10808 1825135056u, 2725923798u,
10809 580988377u, 2826990641u,
10810 247825043u, 3167748333u,
10811 812546227u, 2506885666u,
10812 2584372201u, 1758123094u,
10813 1891789696u, 389974094u,
10814 345313518u, 2022370576u,
10815 3886113119u, 3338548567u,
10816 1083486947u, 2583576230u,
10817 1776047957u, 1771384107u,
10818 3604937815u, 3198590202u,
10819 3027522813u, 4155628142u,
10820 4232136669u, 427759438u,
10821 4244322689u, 542201663u,
10822 1549591985u, 2856634168u,
10823 556609672u, 45845311u,
10824 1175961330u, 3948351189u,
10825 4165739882u, 4194218315u,
10826 1634635545u, 4151937410u,
10827 713127376u, 1467786451u,
10828 1327394015u, 2743592929u,
10829 2638154051u, 810082938u,
10830 3077742128u, 1062268187u,
10831 4084325664u, 3810665822u,
10832 3735739145u, 2794294783u,
10833 2335576331u, 2560479831u,
10834 690240711u, 997658837u,
10835 2442302747u, 3948961926u,
10836 3958366652u, 3067277639u,
10837 2059157774u, 1211737169u,
10838 1516711748u, 2339636583u,
10839 4188504038u, 59581167u,
10840 2767897792u, 1389679610u,
10841 2658147000u, 2643979752u,
10842 3758739543u, 4189944477u,
10843 1454470782u, 100876854u,
10844 2995362413u, 118817200u,
10845 3252925478u, 2062343506u,
10846 2804483644u, 3088828656u,
10847 1231633714u, 4168280671u,
10848 2931588131u, 3284356565u,
10849 1255909792u, 3130054947u,
10850 4173605289u, 1407328702u,
10851 1677744031u, 3532596884u,
10852 3162657845u, 3887208531u,
10853 2256541290u, 3459463480u,
10854 3740979556u, 259034107u,
10855 392987633u, 3233195759u,
10856 3606709555u, 3424793077u,
10857 315836068u, 3200749877u,
10858 4065431359u, 760633989u,
10859 2982018998u, 1811050648u,
10860 234531934u, 1115203611u,
10861 3897494162u, 1516407838u,
10862 1603559457u, 323296368u,
10863 2632963283u, 1778459926u,
10864 2879836826u, 2146672889u,
10865 3486330348u, 492621815u,
10866 1231665285u, 2457048126u,
10867 3438440082u, 2217471853u,
10868 3355404249u, 3275550588u,
10869 1052645068u, 862072556u,
10870 4110617119u, 3745267835u,
10871 2657392572u, 4279236653u,
10872 1688445808u, 701920051u,
10873 956734128u, 581695350u,
10874 3157862788u, 2585726058u,
10875 1192588249u, 1410111809u,
10876 1651193125u, 3326135446u,
10877 1073280453u, 97376972u,
10878 2513844237u, 2187968410u,
10879 3976859649u, 4267859263u,
10880 3429034542u, 564493077u,
10881 3000537321u, 479241367u,
10882 3845637831u, 2868987960u,
10883 51544337u, 1029173765u,
10884 393624922u, 704325635u,
10885 2357610553u, 1418509533u,
10886 2007814586u, 3866658271u,
10887 3082385053u, 735688735u,
10888 916110004u, 3283299459u,
10889 1051684175u, 1083796807u,
10890 4074716319u, 813690332u,
10891 144264390u, 1439630796u,
10892 1508556987u, 675582689u,
10893 3748881891u, 3195309868u,
10894 362884708u, 1616408198u,
10895 43233176u, 837301135u,
10896 881504822u, 3254795114u,
10897 1385506591u, 2799925823u,
10898 1469874582u, 3464841997u,
10899 497175391u, 3929484338u,
10900 3975771289u, 1798536177u,
10901 2926265846u, 1374242438u,
10902 3675707838u, 4205965408u,
10903 3153165629u, 1499475160u,
10904 187287713u, 548490821u,
10905 3255259608u, 4247675634u,
10906 1940181471u, 3779953975u,
10907 687167150u, 2319566715u,
10908 1742785722u, 785893184u,
10909 2296977392u, 2778575413u,
10910 1794720651u, 48131484u,
10911 4084891412u, 1160134629u,
10912 3737623280u, 823113169u,
10913 3423207646u, 3803213486u,
10914 710625654u, 4116162021u,
10915 3693420287u, 4167766971u,
10916 1666602807u, 295320990u,
10917 3513255468u, 2487440590u,
10918 234080704u, 4004655503u,
10919 2971762528u, 1479656873u,
10920 4090178629u, 4044418876u,
10921 391947536u, 1462554406u,
10922 3909295855u, 1239580330u,
10923 1515601363u, 2011102035u,
10924 1442068334u, 4265993528u,
10925 1191921695u, 2291355695u,
10926 4257172787u, 576405853u,
10927 314332944u, 4038839101u,
10928 55559918u, 2378985842u,
10929 711098718u, 2425317635u,
10930 1644327317u, 1401013391u,
10931 4193760037u, 2958260436u,
10932 3167371443u, 3062418115u,
10933 3800755475u, 3167030094u,
10934 3489648204u, 1405430357u,
10935 526177822u, 2602636307u,
10936 915406019u, 4264167741u,
10937 1484090483u, 3070944737u,
10938 254529415u, 4017058800u,
10939 1702710265u, 1029665228u,
10940 2000382906u, 3185573940u,
10941 1381258384u, 4036354071u,
10942 2900841028u, 2670703363u,
10943 2921748807u, 2899069938u,
10944 4130543625u, 688472265u,
10945 4186808827u, 1054670286u,
10946 1132985391u, 2840525968u,
10947 4175776103u, 338058159u,
10948 1735964501u, 1539305024u,
10949 3497121710u, 1568260669u,
10950 2227290760u, 146827036u,
10951 3977176001u, 4060134777u,
10952 857488494u, 250055052u,
10953 4284109679u, 2502815838u,
10954 2592281721u, 1603444633u,
10955 1390562014u, 1556658131u,
10956 616327404u, 2448966429u,
10957 3051191726u, 3891353218u,
10958 1213304082u, 762328245u,
10959 2239052397u, 1082330589u,
10960 2455957292u, 201837927u,
10961 405397452u, 3079886794u,
10962 2583939798u, 2848283092u,
10963 3750724631u, 883849006u,
10964 3204198988u, 3341327098u,
10965 1855234968u, 1982110346u,
10966 1485529487u, 541496720u,
10967 4117290321u, 3607433551u,
10968 2168864636u, 133643215u,
10969 1055817409u, 3847827123u,
10970 2960769387u, 4046101649u,
10971 1176127003u, 4015671361u,
10972 4243643405u, 2849988118u,
10973 517111221u, 1796672358u,
10974 2045051700u, 3452457457u,
10975 2948254999u, 2102063419u,
10976 1556410577u, 1536380876u,
10977 3776661467u, 3281002516u,
10978 1735616066u, 1539151988u,
10979 1087795162u, 3332431596u,
10980 685631442u, 1147951686u,
10981 95237878u, 2005032160u,
10982 4012206915u, 4224354805u,
10983 3204999386u, 2415262714u,
10984 1433635018u, 116647396u,
10985 83167836u, 2881562655u,
10986 2729416454u, 1029284767u,
10987 881378302u, 2159170082u,
10988 555057366u, 1169104445u,
10989 3963877000u, 1919171906u,
10990 336034862u, 2017579106u,
10991 4059340529u, 3020819343u,
10992 865146997u, 2473524405u,
10993 944743644u, 1694443528u,
10994 1804513294u, 2904752429u,
10995 617975720u, 3671562289u,
10996 260177668u, 505662155u,
10997 1885941445u, 2504509403u,
10998 2260041112u, 1019936943u,
10999 3722741628u, 1511077569u,
11000 3100701179u, 1379422864u,
11001 1535670711u, 773792826u,
11002 1103819072u, 2089123665u,
11003 1157547425u, 329152940u,
11004 4142587430u, 484732447u,
11005 2475035432u, 1120017626u,
11006 412145504u, 965125959u,
11007 324924679u, 2809286837u,
11008 2842141483u, 4029205195u,
11009 2974306813u, 515627448u,
11010 3791551981u, 1097806406u,
11011 3873078673u, 136118734u,
11012 1872130856u, 3632422367u,
11013 3574135531u, 4017075736u,
11014 1699452298u, 1403506686u,
11015 344414660u, 1189129691u,
11016 3487080616u, 1516736273u,
11017 1805475756u, 2562064338u,
11018 163335594u, 2732147834u,
11019 4077452507u, 2984955003u,
11020 4271866024u, 3071338162u,
11021 2347111903u, 873829983u,
11022 1948409509u, 1923531348u,
11023 459509140u, 771592405u,
11024 1750124750u, 2334938333u,
11025 213811117u, 2586632018u,
11026 185232757u, 4032960199u,
11027 2447383637u, 284777551u,
11028 1654276320u, 2687561076u,
11029 3512945009u, 308584855u,
11030 1861027147u, 4102279334u,
11031 3203802620u, 1692079268u,
11032 4250142168u, 2565680167u,
11033 1507046104u, 841195925u,
11034 520565830u, 3674576684u,
11035 38924274u, 3770488806u,
11036 2414430882u, 3978473838u,
11037 3703994407u, 69201295u,
11038 3099963860u, 1255084262u,
11039 690971838u, 3539996781u,
11040 3696902571u, 3593730713u,
11041 2363435042u, 54945052u,
11042 1785765213u, 184911581u,
11043 1586241476u, 1939595371u,
11044 2534883189u, 2432427547u,
11045 2374171993u, 2039128933u,
11046 2955715987u, 2295501078u,
11047 2741583197u, 1280920000u,
11048 686818699u, 1238742497u,
11049 3843660102u, 82177963u,
11050 1281043691u, 1121403845u,
11051 1697846708u, 284852964u,
11052 278661677u, 2889101923u,
11053 2127558730u, 713121337u,
11054 872502474u, 511142139u,
11055 1261140657u, 1747052377u,
11056 2108187161u, 927011680u,
11057 955328267u, 3821994995u,
11058 2707230761u, 4142246789u,
11059 4134691985u, 1958963937u,
11060 2498463509u, 1977988705u,
11061 1419293714u, 1636932722u,
11062 2567532373u, 4075249328u,
11063 240575705u, 1956681213u,
11064 2598802768u, 2025886508u,
11065 4104757832u, 3026358429u,
11066 3242615202u, 4026813725u,
11067 255108733u, 1845587644u,
11068 3573008472u, 3615577014u,
11069 1222733548u, 1205557630u,
11070 917608574u, 1363253259u,
11071 1541946015u, 3087190425u,
11072 1138008081u, 1444019663u,
11073 109793386u, 341851980u,
11074 857839960u, 2515339233u,
11075 156283211u, 1906768669u,
11076 3886713057u, 1276595523u,
11077 2809830736u, 460237542u,
11078 3420452099u, 142985419u,
11079 205970448u, 4198897105u,
11080 1950698961u, 2069753399u,
11081 1142216925u, 1113051162u,
11082 1033680610u, 4278599955u,
11083 1106466069u, 356742959u,
11084 531521052u, 3494863964u,
11085 225629455u, 3735275001u,
11086 3662626864u, 1750561299u,
11087 1012864651u, 2101846429u,
11088 1074553219u, 668829411u,
11089 992181339u, 3384018814u,
11090 3330664522u, 860966321u,
11091 1885071395u, 4233785523u,
11092 100741310u, 451656820u,
11093 2148187612u, 1063001151u,
11094 360256231u, 107312677u,
11095 3650357479u, 2390172694u,
11096 22452685u, 237319043u,
11097 3600462351u, 1216645846u,
11098 2088767754u, 164402616u,
11099 2418980170u, 926137824u,
11100 94638678u, 1689811113u,
11101 2751052984u, 1767810825u,
11102 271289013u, 3896132233u,
11103 103797041u, 1397772514u,
11104 3441135892u, 3323383489u,
11105 2491268371u, 1662561885u,
11106 1612872497u, 2986430557u,
11107 2756998822u, 207428029u,
11108 937973965u, 2791656726u,
11109 1949717207u, 2260498180u,
11110 2648427775u, 2360400900u,
11111 2080496169u, 486358863u,
11112 1582022990u, 1263709570u,
11113 1396468647u, 1377764574u,
11114 363008508u, 1293502429u,
11115 224580012u, 4252610345u,
11116 1435134775u, 1099809675u,
11117 533671980u, 1533438766u,
11118 1820532305u, 2776960536u,
11119 3374512975u, 3542220540u,
11120 822810075u, 3716663290u,
11121 1157398049u, 3752806924u,
11122 4081637863u, 337070226u,
11123 3866585976u, 359270190u,
11124 2110942730u, 3267551635u,
11125 644850146u, 1306761320u,
11126 746972907u, 934259457u,
11127 2341378668u, 2220373824u,
11128 1242645122u, 4109252858u,
11129 1625266099u, 1173698481u,
11130 383517064u, 896322512u,
11131 3377483696u, 1788337208u,
11132 455496839u, 3194373887u,
11133 1837689083u, 1336556841u,
11134 1658628529u, 2911512007u,
11135 3838343487u, 2757664765u,
11136 1537187340u, 3712582785u,
11137 367022558u, 3071359622u,
11138 3926147070u, 35432879u,
11139 3093195926u, 2561488770u,
11140 4273132307u, 3898950547u,
11141 2838251049u, 2103926083u,
11142 2549435227u, 536047554u,
11143 1858986613u, 2040551642u,
11144 1147412575u, 1972369852u,
11145 4166184983u, 3528794619u,
11146 4077477194u, 3565689036u,
11147 808048238u, 3826350461u,
11148 1359641525u, 1197100813u,
11149 265993036u, 1864569342u,
11150 725164342u, 2264788336u,
11151 1831223342u, 3329594980u,
11152 923017956u, 490608221u,
11153 3818634478u, 258154469u,
11154 1441714797u, 1174785921u,
11155 3833372385u, 3287246572u,
11156 1677395563u, 3569218731u,
11157 868981704u, 2163330264u,
11158 2649450292u, 500120236u,
11159 465161780u, 746438382u,
11160 1145009669u, 2520062970u,
11161 2810524030u, 1561519055u,
11162 1479878006u, 3864969305u,
11163 2686075657u, 4042710240u,
11164 3224066062u, 2774151984u,
11165 2226179547u, 1643626042u,
11166 2328730865u, 3160666939u,
11167 2107011431u, 96459446u,
11168 3920328742u, 3336407558u,
11169 829404209u, 1878067032u,
11170 1235983679u, 4237425634u,
11171 466519055u, 3870676863u,
11172 934312076u, 2952135524u,
11173 276949224u, 4100839753u,
11174 424001484u, 1955120893u,
11175 4015478120u, 1265237690u,
11176 427484362u, 4246879223u,
11177 3452969617u, 1724363362u,
11178 1553513184u, 834830418u,
11179 1858777639u, 3476334357u,
11180 4144030366u, 2450047160u,
11181 2950762705u, 4277111759u,
11182 358032121u, 2511026735u,
11183 167923105u, 2059208280u,
11184 251949572u, 3065234219u,
11185 1535473864u, 556796152u,
11186 1513237478u, 3150857516u,
11187 1103404394u, 198182691u,
11188 1476438092u, 2913077464u,
11189 207119516u, 3963810232u,
11190 2954651680u, 1535115487u,
11191 3051522276u, 4046477658u,
11192 917804636u, 864395565u,
11193 632704095u, 140762681u,
11194 1802040304u, 990407433u,
11195 3771506212u, 4106024923u,
11196 1287729497u, 2198985327u,
11197 4052924496u, 2926590471u,
11198 3084557148u, 1472898694u,
11199 1009870118u, 559702706u,
11200 4265214507u, 82077489u,
11201 3067891003u, 3295678907u,
11202 2402308151u, 1096697687u,
11203 464407878u, 4190838199u,
11204 4269578403u, 3060919438u,
11205 2899950405u, 3046872820u,
11206 733509243u, 1583801700u,
11207 40453902u, 3879773881u,
11208 1993425202u, 2185339100u,
11209 1877837196u, 3912423882u,
11210 3293122640u, 4104318469u,
11211 1679617763u, 3703603898u,
11212 8759461u, 2540185277u,
11213 1152198475u, 2038345882u,
11214 2503579743u, 1446869792u,
11215 2019419351u, 4051584612u,
11216 3178289407u, 3992503830u,
11217 2879018745u, 2719373510u,
11218 700836153u, 1675560450u,
11219 4121245793u, 2064715719u,
11220 343595772u, 1996164093u,
11221 3130433948u, 405251683u,
11222 2804817126u, 1607133689u,
11223 463852893u, 2864244470u,
11224 2224044848u, 4071581802u,
11225 2537107938u, 2246347953u,
11226 3207234525u, 2028708916u,
11227 2272418128u, 803575837u,
11228 38655481u, 2170452091u,
11229 3272166407u, 557660441u,
11230 4019147902u, 3841480082u,
11231 298459606u, 2600943364u,
11232 2440657523u, 255451671u,
11233 3424361375u, 779434428u,
11234 3088526123u, 490671625u,
11235 1322855877u, 3452203069u,
11236 3057021940u, 2285701422u,
11237 2014993457u, 2390431709u,
11238 2002090272u, 1568745354u,
11239 1783152480u, 823305654u,
11240 4053862835u, 2200236540u,
11241 3009412313u, 3184047862u,
11242 3032187389u, 4159715581u,
11243 2966902888u, 252986948u,
11244 1849329144u, 3160134214u,
11245 3420960112u, 3198900547u,
11246 749160960u, 379139040u,
11247 1208883495u, 1566527339u,
11248 3006227299u, 4194096960u,
11249 556075248u, 497404038u,
11250 1717327230u, 1496132623u,
11251 1775955687u, 1719108984u,
11252 1014328900u, 4189966956u,
11253 2108574735u, 2584236470u,
11254 684087286u, 531310503u,
11255 4264509527u, 773405691u,
11256 3088905079u, 3456882941u,
11257 3105682208u, 3382290593u,
11258 2289363624u, 3296306400u,
11259 4168438718u, 467441309u,
11260 777173623u, 3241407531u,
11261 1183994815u, 1132983260u,
11262 1610606159u, 2540270567u,
11263 2649684057u, 1397502982u,
11264 146657385u, 3318434267u,
11265 2109315753u, 3348545480u,
11266 3193669211u, 811750340u,
11267 1073256162u, 3571673088u,
11268 546596661u, 1017047954u,
11269 3403136990u, 2540585554u,
11270 1477047647u, 4145867423u,
11271 2826408201u, 3531646869u,
11272 784952939u, 943914610u,
11273 2717443875u, 3657384638u,
11274 1806867885u, 1903578924u,
11275 3985088434u, 1911188923u,
11276 1764002686u, 3672748083u,
11277 1832925325u, 241574049u,
11278 519948041u, 3181425568u,
11279 2939747257u, 1634174593u,
11280 3429894862u, 3529565564u,
11281 1089679033u, 240953857u,
11282 2025369941u, 2695166650u,
11283 517086873u, 2964595704u,
11284 3017658263u, 3828377737u,
11285 2144895011u, 994799311u,
11286 1184683823u, 4260564140u,
11287 308018483u, 4262383425u,
11288 1374752558u, 3431057723u,
11289 1572637805u, 383233885u,
11290 3188015819u, 4051263539u,
11291 233319221u, 3794788167u,
11292 2017406667u, 919677938u,
11293 4074952232u, 1683612329u,
11294 4213676186u, 327142514u,
11295 3032591014u, 4204155962u,
11296 206775997u, 2283918569u,
11297 2395147154u, 3427505379u,
11298 2211319468u, 4153726847u,
11299 2217060665u, 350160869u,
11300 2493667051u, 1648200185u,
11301 3441709766u, 1387233546u,
11302 140980u, 1891558063u,
11303 760080239u, 2088061981u,
11304 1580964938u, 740563169u,
11305 422986366u, 330624974u,
11306 4264507722u, 150928357u,
11307 2738323042u, 2948665536u,
11308 918718096u, 376390582u,
11309 3966098971u, 717653678u,
11310 3219466255u, 3799363969u,
11311 3424344721u, 3187805406u,
11312 375347278u, 3490350144u,
11313 1992212097u, 2263421398u,
11314 3855037968u, 1928519266u,
11315 3866327955u, 1129127000u,
11316 1782515131u, 2746577402u,
11317 3059200728u, 2108753646u,
11318 2738070963u, 1336849395u,
11319 1705302106u, 768287270u,
11320 1343511943u, 2247006571u,
11321 1956142255u, 1780259453u,
11322 3475618043u, 212490675u,
11323 622521957u, 917121602u,
11324 1852992332u, 1267987847u,
11325 3170016833u, 2549835613u,
11326 3299763344u, 2864033668u,
11327 3378768767u, 1236609378u,
11328 4169365948u, 3738062408u,
11329 2661022773u, 2006922227u,
11330 2760592161u, 3828932355u,
11331 2636387819u, 2616619070u,
11332 1237256330u, 3449066284u,
11333 2871755260u, 3729280948u,
11334 3862686086u, 431292293u,
11335 3285899651u, 786322314u,
11336 2531158535u, 724901242u,
11337 2377363130u, 1415970351u,
11338 1244759631u, 3263135197u,
11339 965248856u, 174024139u,
11340 2297418515u, 2954777083u,
11341 987586766u, 3206261120u,
11342 4059515114u, 3903854066u,
11343 1931934525u, 2287507921u,
11344 1827135136u, 1781944746u,
11345 574617451u, 2299034788u,
11346 2650140034u, 4081586725u,
11347 2482286699u, 1109175923u,
11348 458483596u, 618705848u,
11349 4059852729u, 1813855658u,
11350 4190721328u, 1129462471u,
11351 4089998050u, 3575732749u,
11352 2375584220u, 1037031473u,
11353 1623777358u, 3389003793u,
11354 546597541u, 352770237u,
11355 1383747654u, 3122687303u,
11356 1646071378u, 1164309901u,
11357 290870767u, 830691298u,
11358 929335420u, 3193251135u,
11359 989577914u, 3626554867u,
11360 591974737u, 3996958215u,
11361 3163711272u, 3071568023u,
11362 1516846461u, 3656006011u,
11363 2698625268u, 2510865430u,
11364 340274176u, 1167681812u,
11365 3698796465u, 3155218919u,
11366 4102288238u, 1673474350u,
11367 3069708839u, 2704165015u,
11368 1237411891u, 1854985978u,
11369 3646837503u, 3625406022u,
11370 921552000u, 1712976649u,
11371 3939149151u, 878608872u,
11372 3406359248u, 1068844551u,
11373 1834682077u, 4155949943u,
11374 2437686324u, 3163786257u,
11375 2645117577u, 1988168803u,
11376 747285578u, 1626463554u,
11377 1235300371u, 1256485167u,
11378 1914142538u, 4141546431u,
11379 3838102563u, 582664250u,
11380 1883344352u, 2083771672u,
11381 2611657933u, 2139079047u,
11382 2250573853u, 804336148u,
11383 3066325351u, 2770847216u,
11384 4275641370u, 1455750577u,
11385 3346357270u, 1674051445u,
11386 601221482u, 3992583643u,
11387 1402445097u, 3622527604u,
11388 2509017299u, 2966108111u,
11389 2557027816u, 900741486u,
11390 1790771021u, 2912643797u,
11391 2631381069u, 4014551783u,
11392 90375300u, 300318232u,
11393 3269968032u, 2679371729u,
11394 2664752123u, 3517585534u,
11395 3253901179u, 542270815u,
11396 1188641600u, 365479232u,
11397 2210121140u, 760762191u,
11398 1273768482u, 1216399252u,
11399 3484324231u, 4287337666u,
11400 16322182u, 643179562u,
11401 325675502u, 3652676161u,
11402 3120716054u, 3330259752u,
11403 1011990087u, 2990167340u,
11404 1097584090u, 3262252593u,
11405 1829409951u, 3665087267u,
11406 1214854475u, 2134299399u,
11407 3704419305u, 411263051u,
11408 1625446136u, 549838529u,
11409 4283196353u, 1342880802u,
11410 3460621305u, 1967599860u,
11411 4282843369u, 1275671016u,
11412 2544665755u, 853593042u,
11413 901109753u, 2682611693u,
11414 110631633u, 797487791u,
11415 1472073141u, 850464484u,
11416 797089608u, 3286110054u,
11417 350397471u, 2775631060u,
11418 366448238u, 3842907484u,
11419 2219863904u, 3623364733u,
11420 1850985302u, 4009616991u,
11421 294963924u, 3693536939u,
11422 3061255808u, 1615375832u,
11423 1920066675u, 4113028420u,
11424 4032223840u, 2318423400u,
11425 2701956286u, 4145497671u,
11426 3991532344u, 2536338351u,
11427 1679099863u, 1728968857u,
11428 449740816u, 2686506989u,
11429 685242457u, 97590863u,
11430 3258354115u, 1502282913u,
11431 1235084019u, 2151665147u,
11432 528459289u, 231097464u,
11433 2477280726u, 3651607391u,
11434 2091754612u, 1178454681u,
11435 980597335u, 1604483865u,
11436 1842333726u, 4146839064u,
11437 3213794286u, 2601416506u,
11438 754220096u, 3571436033u,
11439 488595746u, 1448097974u,
11440 4004834921u, 238887261u,
11441 3320337489u, 1416989070u,
11442 2928916831u, 4093725287u,
11443 186020771u, 2367569534u,
11444 3046087671u, 4090084518u,
11445 3548184546u, 679517009u,
11446 1962659444u, 3539886328u,
11447 4192003933u, 1678423485u,
11448 3827951761u, 3086277222u,
11449 2144472852u, 1390394371u,
11450 2976322029u, 1574517163u,
11451 3553313841u, 119173722u,
11452 1702434637u, 1766260771u,
11453 3629581771u, 1407497759u,
11454 895654784u, 751439914u,
11455 4008409498u, 215917713u,
11456 1482103833u, 695551833u,
11457 1288382231u, 2656990891u,
11458 2581779077u, 1570750352u,
11459 3710689053u, 1741390464u,
11460 2666411616u, 3533987737u,
11461 4289478316u, 3576119563u,
11462 4118694920u, 108199666u,
11463 3869794273u, 963183826u,
11464 2081410737u, 3796810515u,
11465 791123882u, 2525792704u,
11466 1036883117u, 136547246u,
11467 875691100u, 2592925324u,
11468 614302599u, 3013176417u,
11469 2689342539u, 427154472u,
11470 532957601u, 1228758574u,
11471 1898117151u, 1181643858u,
11472 1908591042u, 1464255968u,
11473 446980910u, 2984611177u,
11474 58509511u, 1046943619u,
11475 3508927906u, 2001585786u,
11476 2544767379u, 1525438381u,
11477 552181222u, 1959725830u,
11478 879448844u, 1348536411u,
11479 4242243590u, 2861338018u,
11480 1082052441u, 1034351453u,
11481 601175800u, 764077711u,
11482 530635011u, 3785343245u,
11483 2178026726u, 117256687u,
11484 2378297261u, 457568934u,
11485 76438221u, 4104954272u,
11486 956793873u, 3783168634u,
11487 2485968477u, 2381948487u,
11488 4226929450u, 3148473363u,
11489 2518273601u, 3569490233u,
11490 879369091u, 2180270337u,
11491 3674375989u, 1387729170u,
11492 977997984u, 4270646856u,
11493 568650985u, 951677556u,
11494 4213877384u, 2721005055u,
11495 1073364549u, 2563403831u,
11496 1678669911u, 66786703u,
11497 2273631661u, 1149351924u,
11498 3651298990u, 1581883443u,
11499 246723096u, 1895026827u,
11500 3810605772u, 3711056516u,
11501 4058833288u, 2193790614u,
11502 2080120290u, 3638638708u,
11503 2915672708u, 2263003308u,
11504 2361934197u, 4136767460u,
11505 1976115991u, 3448840877u,
11506 2019238520u, 225333538u,
11507 874340815u, 2976159827u,
11508 1555273378u, 3797521928u,
11509 1942347150u, 3262952567u,
11510 435997738u, 340403353u,
11511 2817830907u, 2078619498u,
11512 749534111u, 1178073973u,
11513 894654712u, 3361226032u,
11514 841092198u, 3288261538u,
11515 1696412169u, 1496966875u,
11516 697501571u, 1059158875u,
11517 3739946319u, 2481012988u,
11518 568983526u, 114945840u,
11519 1559249010u, 2218244008u,
11520 2841706923u, 1632780103u,
11521 4020169654u, 2087949619u,
11522 2438736103u, 24032648u,
11523 833416317u, 3787017905u,
11524 2373238993u, 2575395164u,
11525 3434544481u, 3228481067u,
11526 2542976862u, 2971726178u,
11527 2880371864u, 3642087909u,
11528 2407477975u, 2239080836u,
11529 1043714217u, 3894199764u,
11530 2235879182u, 203853421u,
11531 2933669448u, 2504940536u,
11532 834683330u, 425935223u,
11533 3560796393u, 3565833278u,
11534 1668000829u, 3683399154u,
11535 3414330886u, 1748785729u,
11536 1023171602u, 580966986u,
11537 2531038985u, 3227325488u,
11538 2657385925u, 2124704694u,
11539 233442446u, 1107045577u,
11540 3407293834u, 552770757u,
11541 3899097693u, 1067532701u,
11542 115667924u, 1406028344u,
11543 1707768231u, 3724015962u,
11544 2419657149u, 18613994u,
11545 2532882091u, 3476683808u,
11546 1560838678u, 811220224u,
11547 895961699u, 3762914298u,
11548 1328752423u, 1844996900u,
11549 1420427894u, 1848067707u,
11550 1210281744u, 904215228u,
11551 4055325594u, 1118521573u,
11552 2496554183u, 2579259919u,
11553 3996647489u, 3657647605u,
11554 325254059u, 3136157065u,
11555 3951522674u, 4052925250u,
11556 3341068436u, 2287683323u,
11557 1313073005u, 126005630u,
11558 2505120084u, 1194725057u,
11559 853746559u, 3555092974u,
11560 2689238752u, 49515858u,
11561 1244776042u, 1069300695u,
11562 61073168u, 1010661841u,
11563 1269521335u, 1902040126u,
11564 990632502u, 2378708922u,
11565 3858321250u, 1400735275u,
11566 2974699176u, 2771676666u,
11567 170995186u, 2877798589u,
11568 545726212u, 2225229957u,
11569 1086473152u, 3454177594u,
11570 3859483262u, 1499729584u,
11571 2088002891u, 2883475137u,
11572 3222194252u, 4144472319u,
11573 2212229854u, 4146740722u,
11574 567988835u, 1051332394u,
11575 3932046135u, 542648229u,
11576 3017852446u, 1277887997u,
11577 162888005u, 1669710469u,
11578 1492500905u, 553041029u,
11579 1434876932u, 533989516u,
11580 3817492747u, 584127807u,
11581 4147115982u, 2993670925u,
11582 4020312558u, 710021255u,
11583 3509733475u, 3587959456u,
11584 2088550465u, 1745399498u,
11585 2952242967u, 1259815443u,
11586 869648362u, 1404723176u,
11587 3947542735u, 1334333531u,
11588 3873471582u, 229399758u,
11589 59634866u, 3239516985u,
11590 3844250972u, 1275954779u,
11591 1385684948u, 2243700741u,
11592 2512155003u, 1685649437u,
11593 639306006u, 2524620206u,
11594 955360345u, 1646776457u,
11595 576786501u, 655707039u,
11596 2864351838u, 3736264674u,
11597 655621239u, 362070173u,
11598 1200907897u, 2384379464u,
11599 15823708u, 206117476u,
11600 3652870937u, 122927134u,
11601 1193310960u, 1093099415u,
11602 3696538026u, 4112584792u,
11603 1834541277u, 845639252u,
11604 2069527017u, 547588820u,
11605 4178147211u, 2827259351u,
11606 1764455305u, 3312003602u,
11607 940846775u, 1054995047u,
11608 2976960697u, 1934305529u,
11609 3095615046u, 3354962706u,
11610 2199137382u, 1005722394u,
11611 1875867180u, 2064356511u,
11612 3363633633u, 2688499147u,
11613 4019734130u, 3096333006u,
11614 2069509024u, 2906358341u,
11615 3247463123u, 4191788132u,
11616 2232866485u, 1456016086u,
11617 1422674894u, 867282151u,
11618 1851386407u, 1268304058u,
11619 1612503136u, 1739843072u,
11620 134947567u, 2978775774u,
11621 2051592101u, 1017127033u,
11622 1284167756u, 1090844589u,
11623 831688783u, 2079216362u,
11624 2079309682u, 1950585801u,
11625 1626991196u, 3644714163u,
11626 3678110059u, 898470030u,
11627 1117570988u, 2517572125u,
11628 3916646913u, 3182422972u,
11629 3630426828u, 969847973u,
11630 2835126238u, 53541366u,
11631 3427164640u, 3463937250u,
11632 3044785046u, 897322257u,
11633 103038235u, 3804506837u,
11634 3443872170u, 4185408854u,
11635 2557463241u, 4080940424u,
11636 3669923099u, 2789619871u,
11637 2048168570u, 2429169982u,
11638 3174690447u, 2513494106u,
11639 3099587829u, 2627855577u,
11640 1213061732u, 3143736628u,
11641 3482268149u, 1250714337u,
11642 3553412672u, 2689632914u,
11643 31648125u, 3872383625u,
11644 1565760579u, 36665130u,
11645 1282106920u, 359361724u,
11646 751041229u, 2257179590u,
11647 2915361862u, 280819225u,
11648 954406473u, 4101682199u,
11649 2907818413u, 4254297769u,
11650 3493178615u, 3755944354u,
11651 3539557658u, 3330196096u,
11652 4043533423u, 1134196225u,
11653 4177134659u, 127246419u,
11654 4213770762u, 1978302978u,
11655 2442615581u, 923049607u,
11656 1004426206u, 782768297u,
11657 2702745496u, 1880389457u,
11658 2410586681u, 1430106871u,
11659 4103323427u, 3168399477u,
11660 201787012u, 3105353527u,
11661 3716682375u, 3616334719u,
11662 3413209549u, 656672786u,
11663 526032790u, 2895072131u,
11664 2876965944u, 182894450u,
11665 456581318u, 2683752067u,
11666 1287916294u, 1270745752u,
11667 3877875910u, 3190666241u,
11668 3240336907u, 4024807233u,
11669 4227999465u, 2389301430u,
11670 1681224377u, 1576191191u,
11671 3599250276u, 2381111980u,
11672 3995044500u, 995595530u,
11673 3495321877u, 3956024585u,
11674 1611608524u, 3815677453u,
11675 1520987487u, 3669102590u,
11676 2062334396u, 1656117707u,
11677 5457134u, 3234118251u,
11678 4242065111u, 596879987u,
11679 470187419u, 2688566989u,
11680 3259870297u, 660100446u,
11681 1042378442u, 2206034096u,
11682 442236198u, 2542452448u,
11683 493137955u, 392411099u,
11684 3111186954u, 438250493u,
11685 947967568u, 1234595917u,
11686 4230082284u, 2762976773u,
11687 421203727u, 3728409592u,
11688 2870085764u, 1455086530u,
11689 2762099647u, 4011882747u,
11690 1785430706u, 3684427488u,
11691 1215981925u, 3227517889u,
11692 3269061963u, 4037515364u,
11693 1749401388u, 2167451566u,
11694 3168911474u, 4255057396u,
11695 2026092260u, 1736192508u,
11696 4123254745u, 2319366806u,
11697 3909727042u, 3114708966u,
11698 1938800693u, 680793595u,
11699 3933041672u, 616863613u,
11700 1525265867u, 2808224480u,
11701 2122290603u, 1211197714u,
11702 1186177814u, 2395325006u,
11703 3520488321u, 3979192396u,
11704 3540779343u, 4192918639u,
11705 1763872074u, 3402419930u,
11706 2736030448u, 1120335563u,
11707 1698949078u, 3993310631u,
11708 2947659998u, 1461045789u,
11709 1966048551u, 2228221363u,
11710 597941119u, 3498018399u,
11711 1441110751u, 2229999711u,
11712 393987327u, 454500547u,
11713 1222959566u, 567151340u,
11714 2496952483u, 1708770195u,
11715 3774764786u, 1492844524u,
11716 3308300614u, 805568076u,
11717 4068812294u, 3404648243u,
11718 868414882u, 177406999u,
11719 1608110313u, 642061169u,
11720 2093999089u, 222470301u,
11721 1027515771u, 3131251981u,
11722 2851936150u, 4272755262u,
11723 2763002551u, 1881527822u,
11724 1532845092u, 709643652u,
11725 682573592u, 1244104217u,
11726 440905170u, 1111321746u,
11727 796769556u, 2500467040u,
11728 3002618826u, 1112998535u,
11729 1188525643u, 4212674512u,
11730 1780193104u, 1243644607u,
11731 3691719535u, 2958853053u,
11732 2813437721u, 4036584207u,
11733 466635014u, 2277292580u,
11734 4082276003u, 1030800045u,
11735 1899531424u, 609466946u,
11736 1750863246u, 379050598u,
11737 3576413281u, 731493104u,
11738 2707384133u, 2289193651u,
11739 132259176u, 4115195437u,
11740 1769890695u, 2715470335u,
11741 3348954692u, 2166575624u,
11742 1819263183u, 2028531518u,
11743 2154809766u, 3672399742u,
11744 1142139448u, 88299682u,
11745 76727603u, 4198182186u,
11746 2304993586u, 1666387627u,
11747 2488475423u, 3832777692u,
11748 284366017u, 3359785538u,
11749 3469807328u, 2926494787u,
11750 1914195188u, 1134129972u,
11751 3829072836u, 2493478921u,
11752 3738499303u, 3311304980u,
11753 726951526u, 911080963u,
11754 932916545u, 2235559063u,
11755 2909742396u, 1765719309u,
11756 465269850u, 3803621553u,
11757 1456588655u, 508290328u,
11758 1490719640u, 3356513470u,
11759 2262196163u, 1451774941u,
11760 2908490783u, 251085588u,
11761 830410677u, 3172220325u,
11762 4039692645u, 1383603170u,
11763 3897208579u, 1940535730u,
11764 151909546u, 2384458112u,
11765 };
11766
11767 // Return false only if offset is -1 and a spot check of 3 hashes all yield 0.
11768 bool Test(int offset, int len = 0) {
11769 #undef Check
11770 #undef IsAlive
11771
11772 #define Check(x) do { \
11773 const uint32_t actual = (x), e = expected[index++]; \
11774 bool ok = actual == e; \
11775 if (!ok) { \
11776 cerr << "expected " << hex << e << " but got " << actual << endl; \
11777 ++errors; \
11778 } \
11779 assert(ok); \
11780 } while (0)
11781
11782 #define IsAlive(x) do { alive += IsNonZero(x); } while (0)
11783
11784 // After the following line is where the uses of "Check" and such will go.
11785 static int index = 0;
11786 if (offset == -1) { int alive = 0; { uint64_t h = farmhashxo::Hash64WithSeeds(da ta, len++, SEED0, SEED1); IsAlive(h >> 32); IsAlive((h << 32) >> 32); } { uint64 _t h = farmhashxo::Hash64WithSeed(data, len++, SEED); IsAlive(h >> 32); IsAlive( (h << 32) >> 32); } { uint64_t h = farmhashxo::Hash64(data, len++); IsAlive(h >> 32); IsAlive((h << 32) >> 32); } len -= 3; return alive > 0; }
11787 { uint64_t h = farmhashxo::Hash64WithSeeds(data + offset, len, SEED0, SEED1); Ch eck(h >> 32); Check((h << 32) >> 32); }
11788 { uint64_t h = farmhashxo::Hash64WithSeed(data + offset, len, SEED); Check(h >> 32); Check((h << 32) >> 32); }
11789 { uint64_t h = farmhashxo::Hash64(data + offset, len); Check(h >> 32); Check((h << 32) >> 32); }
11790
11791 return true;
11792 #undef Check
11793 #undef IsAlive
11794 }
11795
11796 int RunTest() {
11797 Setup();
11798 int i = 0;
11799 cout << "Running farmhashxoTest";
11800 if (!Test(-1)) {
11801 cout << "... Unavailable\n";
11802 return NoteErrors();
11803 }
11804 // Good. The function is attempting to hash, so run the full test.
11805 int errors_prior_to_test = errors;
11806 for ( ; i < kTestSize - 1; i++) {
11807 Test(i * i, i);
11808 }
11809 for ( ; i < kDataSize; i += i / 7) {
11810 Test(0, i);
11811 }
11812 Test(0, kDataSize);
11813 cout << (errors == errors_prior_to_test ? "... OK\n" : "... Failed\n");
11814 return NoteErrors();
11815 }
11816
11817 #else
11818
11819 // After the following line is where the code to print hash codes will go.
11820 void Dump(int offset, int len) {
11821 { uint64_t h = farmhashxo::Hash64WithSeeds(data + offset, len, SEED0, SEED1); co ut << (h >> 32) << "u, " << ((h << 32) >> 32) << "u," << endl; }
11822 { uint64_t h = farmhashxo::Hash64WithSeed(data + offset, len, SEED); cout << (h >> 32) << "u, " << ((h << 32) >> 32) << "u," << endl; }
11823 { uint64_t h = farmhashxo::Hash64(data + offset, len); cout << (h >> 32) << "u, " << ((h << 32) >> 32) << "u," << endl; }
11824 }
11825
11826 #endif
11827
11828 #undef SEED
11829 #undef SEED1
11830 #undef SEED0
11831
11832 } // namespace farmhashxoTest
11833
11834 #if TESTING
11835
11836 static int farmhashxoTestResult = farmhashxoTest::RunTest();
11837
11838 #else
11839 int main(int argc, char** argv) {
11840 Setup();
11841 cout << "uint32_t expected[] = {\n";
11842 int i = 0;
11843 for ( ; i < kTestSize - 1; i++) {
11844 farmhashxoTest::Dump(i * i, i);
11845 }
11846 for ( ; i < kDataSize; i += i / 7) {
11847 farmhashxoTest::Dump(0, i);
11848 }
11849 farmhashxoTest::Dump(0, kDataSize);
11850 cout << "};\n";
11851 }
11852 #endif
11853
11854 #endif // FARMHASHSELFTEST
OLDNEW
« no previous file with comments | « third_party/tcmalloc/chromium/src/farmhash.h ('k') | third_party/tcmalloc/chromium/src/leak_analyzer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698