summaryrefslogtreecommitdiff
path: root/xdelta3/testing
diff options
context:
space:
mode:
Diffstat (limited to 'xdelta3/testing')
-rw-r--r--xdelta3/testing/checksum_test.cc230
-rw-r--r--xdelta3/testing/checksum_test_c.c173
-rw-r--r--xdelta3/testing/test.h6
3 files changed, 350 insertions, 59 deletions
diff --git a/xdelta3/testing/checksum_test.cc b/xdelta3/testing/checksum_test.cc
index b9a4b0b..353d705 100644
--- a/xdelta3/testing/checksum_test.cc
+++ b/xdelta3/testing/checksum_test.cc
@@ -7,6 +7,16 @@
7#include <map> 7#include <map>
8#include <algorithm> 8#include <algorithm>
9 9
10extern "C" {
11uint32_t xd3_large32_cksum_old (xd3_hash_cfg *cfg, const uint8_t *base, const usize_t look);
12uint32_t xd3_large32_cksum_update_old (xd3_hash_cfg *cfg, uint32_t cksum,
13 const uint8_t *base, const usize_t look);
14
15uint64_t xd3_large64_cksum_old (xd3_hash_cfg *cfg, const uint8_t *base, const usize_t look);
16uint64_t xd3_large64_cksum_update_old (xd3_hash_cfg *cfg, uint64_t cksum,
17 const uint8_t *base, const usize_t look);
18}
19
10using std::list; 20using std::list;
11using std::map; 21using std::map;
12using std::vector; 22using std::vector;
@@ -24,6 +34,14 @@ uint64_t good_64bit_values[] = {
24 7664345821815920749ULL, // ... 34 7664345821815920749ULL, // ...
25}; 35};
26 36
37void print_header() {
38 static int hdr_cnt = 0;
39 if (hdr_cnt++ % 20 == 0) {
40 printf("Name\t\t\t\tConf\t\tCount\tUniq\tFull\tCover\tColls"
41 "\tMB/s\tIters\t#Colls\n");
42 }
43}
44
27struct true_type { }; 45struct true_type { };
28struct false_type { }; 46struct false_type { };
29 47
@@ -51,13 +69,6 @@ struct hhash { // shift "s" bits leaving the high bits as a hash value for
51}; 69};
52 70
53template <typename Word> 71template <typename Word>
54struct nonhash {
55 Word operator()(const Word t, const Word h, const Word mask) {
56 return (t >> h) & mask;
57 }
58};
59
60template <typename Word>
61Word good_word(); 72Word good_word();
62 73
63template<> 74template<>
@@ -92,14 +103,18 @@ struct cksum_params {
92MEMBER 103MEMBER
93struct rabin_karp : public cksum_params<SELF> { 104struct rabin_karp : public cksum_params<SELF> {
94 // (a^cksum_size-1 c_0) + (a^cksum_size-2 c_1) ... 105 // (a^cksum_size-1 c_0) + (a^cksum_size-2 c_1) ...
95 rabin_karp() { 106 rabin_karp()
96 multiplier = good_word<Word>(); 107 : powers(make_powers()),
97 powers = new Word[CksumSize]; 108 product(powers[0] * good_word<Word>()),
98 powers[CksumSize - 1] = 1; 109 incr_state(0) { }
110
111 static Word* make_powers() {
112 Word *p = new Word[CksumSize];
113 p[CksumSize - 1] = 1;
99 for (int i = CksumSize - 2; i >= 0; i--) { 114 for (int i = CksumSize - 2; i >= 0; i--) {
100 powers[i] = powers[i + 1] * multiplier; 115 p[i] = p[i + 1] * good_word<Word>();
101 } 116 }
102 product = powers[0] * multiplier; 117 return p;
103 } 118 }
104 119
105 ~rabin_karp() { 120 ~rabin_karp() {
@@ -120,21 +135,69 @@ struct rabin_karp : public cksum_params<SELF> {
120 } 135 }
121 136
122 Word incr(const uint8_t *ptr) { 137 Word incr(const uint8_t *ptr) {
123 incr_state = multiplier * incr_state - 138 incr_state = good_word<Word>() * incr_state -
124 product * (ptr[-1]) + (ptr[CksumSize - 1]); 139 product * (ptr[-1]) + (ptr[CksumSize - 1]);
125 return incr_state; 140 return incr_state;
126 } 141 }
127 142
128 Word *powers; 143 const Word *const powers;
129 Word product; 144 const Word product;
130 Word multiplier; 145 Word incr_state;
131 Word incr_state; 146};
147
148MEMBER
149struct with_stream : public cksum_params<SELF> {
150 xd3_stream stream;
151
152 with_stream()
153 {
154 xd3_config cfg;
155 memset (&stream, 0, sizeof (stream));
156 xd3_init_config (&cfg, 0);
157 cfg.smatch_cfg = XD3_SMATCH_SOFT;
158 cfg.smatcher_soft.large_look = CksumSize;
159 cfg.smatcher_soft.large_step = CksumSkip;
160 cfg.smatcher_soft.small_look = 4;
161 cfg.smatcher_soft.small_chain = 4;
162 cfg.smatcher_soft.small_lchain = 4;
163 cfg.smatcher_soft.max_lazy = 4;
164 cfg.smatcher_soft.long_enough = 4;
165 CHECK_EQ(0, xd3_config_stream (&stream, &cfg));
166
167 CHECK_EQ(0, xd3_size_hashtable (&stream,
168 1<<10 /* ignored */,
169 stream.smatcher.large_look,
170 & stream.large_hash));
171 }
172 ~with_stream()
173 {
174 xd3_free_stream (&stream);
175 }
176};
177
178MEMBER
179struct large64_cksum : public with_stream<SELF> {
180 Word step(const uint8_t *ptr) {
181 return xd3_large64_cksum (&this->stream.large_hash, ptr, CksumSize);
182 }
183
184 Word state0(const uint8_t *ptr) {
185 incr_state = step(ptr);
186 return incr_state;
187 }
188
189 Word incr(const uint8_t *ptr) {
190 incr_state = xd3_large64_cksum_update (&this->stream.large_hash, incr_state, ptr - 1, CksumSize);
191 return incr_state;
192 }
193
194 Word incr_state;
132}; 195};
133 196
134MEMBER 197MEMBER
135struct large_cksum : public cksum_params<SELF> { 198struct large64_cksum_old : public with_stream<SELF> {
136 Word step(const uint8_t *ptr) { 199 Word step(const uint8_t *ptr) {
137 return xd3_large_cksum (ptr, CksumSize); 200 return xd3_large64_cksum_old (&this->stream.large_hash, ptr, CksumSize);
138 } 201 }
139 202
140 Word state0(const uint8_t *ptr) { 203 Word state0(const uint8_t *ptr) {
@@ -143,13 +206,67 @@ struct large_cksum : public cksum_params<SELF> {
143 } 206 }
144 207
145 Word incr(const uint8_t *ptr) { 208 Word incr(const uint8_t *ptr) {
146 incr_state = xd3_large_cksum_update (incr_state, ptr - 1, CksumSize); 209 incr_state = xd3_large64_cksum_update_old (&this->stream.large_hash, incr_state, ptr - 1, CksumSize);
147 return incr_state; 210 return incr_state;
148 } 211 }
149 212
150 Word incr_state; 213 Word incr_state;
151}; 214};
152 215
216MEMBER
217struct large32_cksum : public with_stream<SELF> {
218 Word step(const uint8_t *ptr) {
219 return xd3_large32_cksum (&this->stream.large_hash, ptr, CksumSize);
220 }
221
222 Word state0(const uint8_t *ptr) {
223 incr_state = step(ptr);
224 return incr_state;
225 }
226
227 Word incr(const uint8_t *ptr) {
228 incr_state = xd3_large32_cksum_update (&this->stream.large_hash, incr_state, ptr - 1, CksumSize);
229 return incr_state;
230 }
231
232 Word incr_state;
233};
234
235MEMBER
236struct large32_cksum_old : public with_stream<SELF> {
237 Word step(const uint8_t *ptr) {
238 return xd3_large32_cksum_old (&this->stream.large_hash, ptr, CksumSize);
239 }
240
241 Word state0(const uint8_t *ptr) {
242 incr_state = step(ptr);
243 return incr_state;
244 }
245
246 Word incr(const uint8_t *ptr) {
247 incr_state = xd3_large32_cksum_update_old (&this->stream.large_hash, incr_state, ptr - 1, CksumSize);
248 return incr_state;
249 }
250
251 Word incr_state;
252};
253
254MEMBER
255struct large_cksum
256 : std::conditional<std::is_same<Word, uint32_t>::value,
257 large32_cksum<SELF>,
258 large64_cksum<SELF>>::type
259{
260};
261
262MEMBER
263struct large_cksum_old
264 : std::conditional<std::is_same<Word, uint32_t>::value,
265 large32_cksum_old<SELF>,
266 large64_cksum_old<SELF>>::type
267{
268};
269
153// TESTS 270// TESTS
154 271
155template <typename Word> 272template <typename Word>
@@ -193,13 +310,21 @@ struct file_stats {
193 310
194 ptr_list &pl = table[word]; 311 ptr_list &pl = table[word];
195 312
313 int collisions = 0;
196 for (ptr_iterator p_i = pl.begin(); 314 for (ptr_iterator p_i = pl.begin();
197 p_i != pl.end(); 315 p_i != pl.end();
198 ++p_i) { 316 ++p_i) {
199 if (memcmp(*p_i, ptr, cksum_size) == 0) { 317 if (memcmp(*p_i, ptr, cksum_size) == 0) {
200 return; 318 return;
201 } 319 }
320 collisions++;
202 } 321 }
322 if (collisions >= 10000)
323 {
324 fprintf(stderr, "Something is not right, lots of collisions=%d\n",
325 collisions);
326 abort();
327 }
203 328
204 unique++; 329 unique++;
205 pl.push_back(ptr); 330 pl.push_back(ptr);
@@ -320,7 +445,7 @@ struct test_result : public test_result_base {
320 /* Fraction of distinct strings of length cksum_size which are not 445 /* Fraction of distinct strings of length cksum_size which are not
321 * represented in the hash table. */ 446 * represented in the hash table. */
322 double collisions() { 447 double collisions() {
323 return (fstats.unique - fstats.unique_values) / fstats.unique; 448 return (fstats.unique - fstats.unique_values) / (double) fstats.unique;
324 } 449 }
325 usize_t colls() { 450 usize_t colls() {
326 return (fstats.unique - fstats.unique_values); 451 return (fstats.unique - fstats.unique_values);
@@ -375,13 +500,8 @@ struct test_result : public test_result_base {
375 fprintf(stderr, "internal error: %d != %d\n", fstats.count, count()); 500 fprintf(stderr, "internal error: %d != %d\n", fstats.count, count());
376 abort(); 501 abort();
377 } 502 }
378 { 503 print_header();
379 static int hdr_cnt = 0; 504 printf("%s\t%d/%d 2^%d\t%u\t%0.4f\t%.4f\t%.4f\t%.1e\t%.2f\t%u\t%u\n",
380 if (hdr_cnt++ % 20 == 0) {
381 printf("Name\tConf\tCount\tUniq\tFull\tColl\tCov\tMB/s\tIters\n");
382 }
383 }
384 printf("%s\t%d/%d/1<<%d\t%u\t%0.2f\t%.2f\t%.2f\t%.2f\t%.4f\t%u\n",
385 test_name, 505 test_name,
386 Checksum::cksum_size, 506 Checksum::cksum_size,
387 Checksum::cksum_skip, 507 Checksum::cksum_skip,
@@ -389,10 +509,11 @@ struct test_result : public test_result_base {
389 count(), 509 count(),
390 uniqueness(), 510 uniqueness(),
391 fullness(), 511 fullness(),
392 collisions(),
393 coverage(), 512 coverage(),
513 collisions(),
394 0.001 * accum_iters * test_size / accum_millis, 514 0.001 * accum_iters * test_size / accum_millis,
395 accum_iters); 515 accum_iters,
516 colls());
396 } 517 }
397 518
398 usize_t size_log2 (usize_t slots) { 519 usize_t size_log2 (usize_t slots) {
@@ -445,8 +566,8 @@ struct test_result : public test_result_base {
445 const uint8_t *ptr; 566 const uint8_t *ptr;
446 const uint8_t *end; 567 const uint8_t *end;
447 usize_t periods; 568 usize_t periods;
448 int last_offset; 569 int64_t last_offset;
449 int stop; 570 int64_t stop;
450 571
451 test_size = buf_size; 572 test_size = buf_size;
452 last_offset = buf_size - Checksum::cksum_size; 573 last_offset = buf_size - Checksum::cksum_size;
@@ -472,7 +593,7 @@ struct test_result : public test_result_base {
472 } else { 593 } else {
473 ptr = buf + last_offset; 594 ptr = buf + last_offset;
474 end = buf + stop; 595 end = buf + stop;
475 596
476 for (; ptr != end; ptr -= Checksum::cksum_skip) { 597 for (; ptr != end; ptr -= Checksum::cksum_skip) {
477 fstats.update(hash(cksum.step(ptr), s_bits, s_mask), ptr); 598 fstats.update(hash(cksum.step(ptr), s_bits, s_mask), ptr);
478 } 599 }
@@ -503,7 +624,6 @@ struct test_result : public test_result_base {
503 } 624 }
504 625
505 if (Checksum::cksum_skip == 1) { 626 if (Checksum::cksum_skip == 1) {
506
507 new_table(n_incrs); 627 new_table(n_incrs);
508 628
509 for (usize_t i = 0; i < test_iters; i++) { 629 for (usize_t i = 0; i < test_iters; i++) {
@@ -516,7 +636,7 @@ struct test_result : public test_result_base {
516 636
517 for (; ptr != end; ptr++) { 637 for (; ptr != end; ptr++) {
518 typename Checksum::word_type w = cksum.incr(ptr); 638 typename Checksum::word_type w = cksum.incr(ptr);
519 assert(w == cksum.step(ptr)); 639 CHECK_EQ(w, cksum.step(ptr));
520 set_table_bit(hash(w, s_bits, s_mask)); 640 set_table_bit(hash(w, s_bits, s_mask));
521 } 641 }
522 } 642 }
@@ -586,30 +706,30 @@ int main(int argc, char** argv) {
586 return 1; 706 return 1;
587 } 707 }
588 708
589#define TEST(T,Z,S,H,C) \ 709#define TEST(T,Z,S,C) \
590 test_result<rabin_karp<T,Z,S,H<T>,C>> \ 710 test_result<rabin_karp<T,Z,S,hhash<T>,C>> \
591 _rka_ ## T ## _ ## Z ## _ ## S ## _ ## H ## _ ## C \ 711 _rka_ ## T ## _ ## Z ## _ ## S ## _ ## C \
592 ("rka_" #T "_" #Z "_" #S "_" #H "_" #C); \ 712 ("rka_" #T "_" #Z "_" #S "_" #C); \
593 test_result<large_cksum<T,Z,S,H<T>,C>> \ 713 test_result<large_cksum<T,Z,S,hhash<T>,C>> \
594 _xck_ ## T ## _ ## Z ## _ ## S ## _ ## H ## _ ## C \ 714 _xck_ ## T ## _ ## Z ## _ ## S ## _ ## C \
595 ("xck_" #T "_" #Z "_" #S "_" #H "_" #C) 715 ("xck_" #T "_" #Z "_" #S "_" #C); \
596 716 test_result<large_cksum_old<T,Z,S,hhash<T>,C>> \
717 _old_ ## T ## _ ## Z ## _ ## S ## _ ## C \
718 ("old_" #T "_" #Z "_" #S "_" #C)
597 719
598#define TESTS(SIZE, SKIP) \ 720#define TESTS(SIZE, SKIP) \
599 TEST(uint32_t, SIZE, SKIP, nonhash, 1); \ 721 TEST(uint32_t, SIZE, SKIP, 1); \
600 TEST(uint32_t, SIZE, SKIP, nonhash, 2); \ 722 TEST(uint32_t, SIZE, SKIP, 2); \
601 TEST(uint32_t, SIZE, SKIP, hhash, 1); \ 723 TEST(uint64_t, SIZE, SKIP, 1); \
602 TEST(uint32_t, SIZE, SKIP, hhash, 2); \ 724 TEST(uint64_t, SIZE, SKIP, 2)
603 TEST(uint64_t, SIZE, SKIP, nonhash, 1); \
604 TEST(uint64_t, SIZE, SKIP, nonhash, 2); \
605 TEST(uint64_t, SIZE, SKIP, hhash, 1); \
606 TEST(uint64_t, SIZE, SKIP, hhash, 2)
607 725
726 TESTS(9, 1);
608 TESTS(9, 9); 727 TESTS(9, 9);
609 // TESTS(9, 15); 728 TESTS(15, 1);
610 TESTS(15, 15); 729 TESTS(15, 15);
730 TESTS(127, 1);
611 TESTS(127, 127); 731 TESTS(127, 127);
612 // TESTS(127, 211); 732 TESTS(211, 1);
613 TESTS(211, 211); 733 TESTS(211, 211);
614 734
615 for (i = 1; i < argc; i++) { 735 for (i = 1; i < argc; i++) {
@@ -630,7 +750,7 @@ int main(int argc, char** argv) {
630 test_result_base *test = *iter; 750 test_result_base *test = *iter;
631 test->reset(); 751 test->reset();
632 752
633 usize_t iters = 100; 753 usize_t iters = 200;
634 long start_test = get_millisecs_now(); 754 long start_test = get_millisecs_now();
635 755
636 do { 756 do {
diff --git a/xdelta3/testing/checksum_test_c.c b/xdelta3/testing/checksum_test_c.c
index 2b32019..8f0507a 100644
--- a/xdelta3/testing/checksum_test_c.c
+++ b/xdelta3/testing/checksum_test_c.c
@@ -1 +1,174 @@
1#include "../xdelta3.c" 1#include "../xdelta3.c"
2
3// OLD CHECKSUM CODE
4
5#define PERMUTE32(x) (__single_hash32[x])
6#define PERMUTE64(x) (__single_hash64[x])
7
8const uint16_t __single_hash32[256] =
9{
10 /* This hashes the input alphabet (Scheme SLIB pseudo-random). */
11 0xbcd1, 0xbb65, 0x42c2, 0xdffe, 0x9666, 0x431b, 0x8504, 0xeb46,
12 0x6379, 0xd460, 0xcf14, 0x53cf, 0xdb51, 0xdb08, 0x12c8, 0xf602,
13 0xe766, 0x2394, 0x250d, 0xdcbb, 0xa678, 0x02af, 0xa5c6, 0x7ea6,
14 0xb645, 0xcb4d, 0xc44b, 0xe5dc, 0x9fe6, 0x5b5c, 0x35f5, 0x701a,
15 0x220f, 0x6c38, 0x1a56, 0x4ca3, 0xffc6, 0xb152, 0x8d61, 0x7a58,
16 0x9025, 0x8b3d, 0xbf0f, 0x95a3, 0xe5f4, 0xc127, 0x3bed, 0x320b,
17 0xb7f3, 0x6054, 0x333c, 0xd383, 0x8154, 0x5242, 0x4e0d, 0x0a94,
18 0x7028, 0x8689, 0x3a22, 0x0980, 0x1847, 0xb0f1, 0x9b5c, 0x4176,
19 0xb858, 0xd542, 0x1f6c, 0x2497, 0x6a5a, 0x9fa9, 0x8c5a, 0x7743,
20 0xa8a9, 0x9a02, 0x4918, 0x438c, 0xc388, 0x9e2b, 0x4cad, 0x01b6,
21 0xab19, 0xf777, 0x365f, 0x1eb2, 0x091e, 0x7bf8, 0x7a8e, 0x5227,
22 0xeab1, 0x2074, 0x4523, 0xe781, 0x01a3, 0x163d, 0x3b2e, 0x287d,
23 0x5e7f, 0xa063, 0xb134, 0x8fae, 0x5e8e, 0xb7b7, 0x4548, 0x1f5a,
24 0xfa56, 0x7a24, 0x900f, 0x42dc, 0xcc69, 0x02a0, 0x0b22, 0xdb31,
25 0x71fe, 0x0c7d, 0x1732, 0x1159, 0xcb09, 0xe1d2, 0x1351, 0x52e9,
26 0xf536, 0x5a4f, 0xc316, 0x6bf9, 0x8994, 0xb774, 0x5f3e, 0xf6d6,
27 0x3a61, 0xf82c, 0xcc22, 0x9d06, 0x299c, 0x09e5, 0x1eec, 0x514f,
28 0x8d53, 0xa650, 0x5c6e, 0xc577, 0x7958, 0x71ac, 0x8916, 0x9b4f,
29 0x2c09, 0x5211, 0xf6d8, 0xcaaa, 0xf7ef, 0x287f, 0x7a94, 0xab49,
30 0xfa2c, 0x7222, 0xe457, 0xd71a, 0x00c3, 0x1a76, 0xe98c, 0xc037,
31 0x8208, 0x5c2d, 0xdfda, 0xe5f5, 0x0b45, 0x15ce, 0x8a7e, 0xfcad,
32 0xaa2d, 0x4b5c, 0xd42e, 0xb251, 0x907e, 0x9a47, 0xc9a6, 0xd93f,
33 0x085e, 0x35ce, 0xa153, 0x7e7b, 0x9f0b, 0x25aa, 0x5d9f, 0xc04d,
34 0x8a0e, 0x2875, 0x4a1c, 0x295f, 0x1393, 0xf760, 0x9178, 0x0f5b,
35 0xfa7d, 0x83b4, 0x2082, 0x721d, 0x6462, 0x0368, 0x67e2, 0x8624,
36 0x194d, 0x22f6, 0x78fb, 0x6791, 0xb238, 0xb332, 0x7276, 0xf272,
37 0x47ec, 0x4504, 0xa961, 0x9fc8, 0x3fdc, 0xb413, 0x007a, 0x0806,
38 0x7458, 0x95c6, 0xccaa, 0x18d6, 0xe2ae, 0x1b06, 0xf3f6, 0x5050,
39 0xc8e8, 0xf4ac, 0xc04c, 0xf41c, 0x992f, 0xae44, 0x5f1b, 0x1113,
40 0x1738, 0xd9a8, 0x19ea, 0x2d33, 0x9698, 0x2fe9, 0x323f, 0xcde2,
41 0x6d71, 0xe37d, 0xb697, 0x2c4f, 0x4373, 0x9102, 0x075d, 0x8e25,
42 0x1672, 0xec28, 0x6acb, 0x86cc, 0x186e, 0x9414, 0xd674, 0xd1a5
43};
44
45const uint32_t __single_hash64[256] =
46{
47 /* http://random.org 2014.10.24 */
48 0xd25e9f0a, 0xb1af9d5e, 0xb753dfa2, 0x157050f7, /* 0 */
49 0xc84b072c, 0xdd14fe7c, 0xf92208c3, 0xdf08a0c0,
50 0x63a5c118, 0x76f5d90f, 0xa2f8b93e, 0xb6c12d22,
51 0xaf074957, 0x966fb7d9, 0x62f7b785, 0xb40e8a09,
52 0x0a811d5d, 0x323a6daa, 0xb62f7c5b, 0xfdcb9a53,
53 0xf25a9067, 0x4506bc7a, 0xff58a74b, 0x5ae62817,
54 0x74097675, 0x722c0fd9, 0x116a2a66, 0x65f76728,
55 0x72c79651, 0xe043cf9d, 0x64b867c7, 0x6604834f,
56 0xcdca58a6, 0x0f164e2d, 0x24515f05, 0x632cdbf8,
57 0x18091d4a, 0x3eff4128, 0x673d1c33, 0xd8e10c71,
58 0x1a3edf11, 0xba52892f, 0xa56949e0, 0xf3e1dd77, /* 10 */
59 0x86fcbe3e, 0x138d66d0, 0x4fc98359, 0xc22e5dd6,
60 0xc59f2267, 0x6c6dd739, 0xe03da190, 0x07e8469c,
61 0xadcfb02c, 0x00d3b0d9, 0xa1f44918, 0x8bd84d87,
62 0x08ec9ec1, 0xbbcd156f, 0xb57718e3, 0x3177e752,
63 0xf52a4d70, 0xde7aaad9, 0x075f1da0, 0x21ba00c6,
64 0xb9469a5c, 0xcf08d5ba, 0x91ac9edc, 0xc6167b63,
65 0xc1974919, 0xc8c8d195, 0x4b1996dd, 0xeff8991c,
66 0xf7f66c6b, 0x25b012e2, 0x59d12a98, 0xea40d3cc,
67 0x41f9970b, 0xec48101a, 0xa3bdcf90, 0x99f16905,
68 0x27af6c97, 0xc849af37, 0x49cad89b, 0xf48c2278, /* 20 */
69 0x5529c3d8, 0x9e7d6dce, 0x16feb52d, 0xf1b0aca1,
70 0xaf28fccb, 0x48e4ce3c, 0xc4436617, 0x64524e3e,
71 0x61806681, 0x6384f2d7, 0x1172880f, 0x34a5ef5f,
72 0xcc8cc0a8, 0x66e8f100, 0x2866085f, 0xba9b1b2d,
73 0x51285949, 0x2be4b574, 0x889b1ef5, 0x3dbe920d,
74 0x9277a62f, 0x0584a9f6, 0x085d8fc4, 0x4b5d403d,
75 0x4e46ca78, 0x3294c2f9, 0x29313e70, 0xe4f09b24,
76 0xe73b331c, 0x072f5552, 0x2e390b78, 0xea0021ca,
77 0xd8f40320, 0xed0e16fd, 0x7de9cf7a, 0xf17e3d6c,
78 0x8df1bd85, 0x052cae67, 0x3486e512, 0x3a1c09b8, /* 30 */
79 0x6c2a7b4e, 0x83455753, 0xbc0353ac, 0x0ffe20b6,
80 0x5fdcef85, 0x010f506c, 0x595ce972, 0xe28680d0,
81 0xa7e216b2, 0xa392ee0f, 0x25b73faa, 0x2b1f4983,
82 0xeeaefe98, 0x1d3d9cbc, 0x6aebe97b, 0x8b7b3584,
83 0x9e6a9a07, 0xd37f1e99, 0x4ac2a441, 0x8ae9a213,
84 0x7d0e27d7, 0x5de54b9a, 0x8621de1f, 0xf0f2f866,
85 0xcb08d275, 0x49c3f87e, 0xd5ee68c1, 0x9802fc77,
86 0x68be6c5e, 0x65aa8c27, 0xf423d5f7, 0x10ec5502,
87 0x9909bce1, 0x509cdf1b, 0x338fea72, 0x2733e9bf,
88 0xf92f4fd7, 0x87738ea2, 0x931a8bbc, 0x0a5c9155, /* 40 */
89 0xbe5edd9b, 0xadbf5838, 0x0338f8d2, 0x290da210,
90 0x390c37d8, 0xe7cffae8, 0x20617ebe, 0x464322dd,
91 0x7b3c4e78, 0xac142dcb, 0x2d5cef76, 0xd8fe49fc,
92 0x60f4e9a9, 0x7473816f, 0x0dc35f39, 0x5eed80c1,
93 0x0cb55ab6, 0x1d3ac541, 0x13c7f529, 0x7bffdf4a,
94 0xe334785b, 0x85263ec1, 0xd132ae56, 0x7c868b9e,
95 0x47f60638, 0x1012b979, 0x81c31dd3, 0x1af868c8,
96 0x0c5d0742, 0xd1b3e1a2, 0x5873200a, 0xf848465c,
97 0x0fc4d596, 0x609c18af, 0xc9f5a480, 0xd1a94a84,
98 0xa1431a3f, 0x7de8bb1a, 0x25f1256b, 0x1dcc732c, /* 50 */
99 0x6aa1549a, 0xa2367281, 0x32f2a77e, 0x82e62a0f,
100 0x045cbb56, 0x74b2027c, 0xd71a32d9, 0x022e7cb5,
101 0xe99be177, 0x60222fdf, 0xd69681ca, 0x9008ee2c,
102 0x32923db4, 0xcf82bf97, 0x38960a5b, 0xb3503d5b,
103 0x9bd4c7f2, 0x33c029c8, 0x1ef504a3, 0xdb249d3b,
104 0x91e89676, 0x4ca43b36, 0x9191433c, 0x465d5dc4,
105 0xf4dcb118, 0x9d11dd00, 0xb592f058, 0xdbe5ce30,
106 0x74790d92, 0x779850a8, 0x7180d25b, 0xfa951d99,
107 0x5990935a, 0x921cb022, 0x3b7c39bc, 0x6a38a7c7,
108 0xdc22703b, 0x142bab3b, 0x4e3d9479, 0x44bb8482, /* 60 */
109 0x8043abce, 0xfebe832a, 0x8e6a2f98, 0x4d43c4fe,
110 0xd192a70a, 0x802f3c3a, 0x5d11bbab, 0x2665d241,
111 0xb3f3a680, 0x3a8d223f, 0xcf82cdb4, 0x4ed28743,
112};
113
114uint64_t
115xd3_large64_cksum_old (xd3_hash_cfg *ignore, const uint8_t *base, const usize_t look)
116{
117 static const uint64_t kBits = 32;
118 static const uint64_t kMask = 0xffffffff;
119 usize_t i = 0;
120 uint64_t low = 0;
121 uint64_t high = 0;
122
123 for (; i < look; i += 1)
124 {
125 low += PERMUTE64(*base++);
126 high += low;
127 }
128
129 return ((high & kMask) << kBits) | (low & kMask);
130}
131
132uint64_t
133xd3_large64_cksum_update_old (xd3_hash_cfg *ignore, const uint64_t cksum,
134 const uint8_t *base, const usize_t look)
135{
136 static const uint64_t kBits = 32;
137 static const uint64_t kMask = 0xffffffff;
138 uint64_t old_c = PERMUTE64(base[0]);
139 uint64_t new_c = PERMUTE64(base[look]);
140 uint64_t low = ((cksum & kMask) - old_c + new_c) & kMask;
141 uint64_t high = ((cksum >> kBits) - (old_c * look) + low) & kMask;
142 return (high << kBits) | low;
143}
144
145uint32_t
146xd3_large32_cksum_old (xd3_hash_cfg *ignore, const uint8_t *base, const usize_t look)
147{
148 static const uint32_t kBits = 16;
149 static const uint32_t kMask = 0xffff;
150 usize_t i = 0;
151 uint32_t low = 0;
152 uint32_t high = 0;
153
154 for (; i < look; i += 1)
155 {
156 low += PERMUTE32(*base++);
157 high += low;
158 }
159
160 return ((high & kMask) << kBits) | (low & kMask);
161}
162
163uint32_t
164xd3_large32_cksum_update_old (xd3_hash_cfg *ignore, const uint32_t cksum,
165 const uint8_t *base, const usize_t look)
166{
167 static const uint32_t kBits = 16;
168 static const uint32_t kMask = 0xffff;
169 uint32_t old_c = PERMUTE32(base[0]);
170 uint32_t new_c = PERMUTE32(base[look]);
171 uint32_t low = ((cksum & kMask) - old_c + new_c) & kMask;
172 uint32_t high = ((cksum >> kBits) - (old_c * look) + low) & kMask;
173 return (high << kBits) | low;
174}
diff --git a/xdelta3/testing/test.h b/xdelta3/testing/test.h
index d1f1a22..30d13a3 100644
--- a/xdelta3/testing/test.h
+++ b/xdelta3/testing/test.h
@@ -18,8 +18,8 @@ extern "C" {
18 18
19#define CHECK_OP(x,y,OP) \ 19#define CHECK_OP(x,y,OP) \
20 do { \ 20 do { \
21 typeof(x) _x(x); \ 21 __typeof__(x) _x(x); \
22 typeof(x) _y(y); \ 22 __typeof__(x) _y(y); \
23 if (!(_x OP _y)) { \ 23 if (!(_x OP _y)) { \
24 cerr << __FILE__ << ":" << __LINE__ << " Check failed: " << #x " " #OP " " #y << endl; \ 24 cerr << __FILE__ << ":" << __LINE__ << " Check failed: " << #x " " #OP " " #y << endl; \
25 cerr << __FILE__ << ":" << __LINE__ << " Expected: " << _x << endl; \ 25 cerr << __FILE__ << ":" << __LINE__ << " Expected: " << _x << endl; \
@@ -68,5 +68,3 @@ pair<T, U> make_pair(const T& t, const U& u) {
68 68
69using std::min; 69using std::min;
70using std::max; 70using std::max;
71
72