3 * Test driver for universal hashing
5 * (c) 2009 Straylight/Edgeware
8 /*----- Licensing notice --------------------------------------------------*
10 * This file is part of the mLib utilities library.
12 * mLib is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU Library General Public License as
14 * published by the Free Software Foundation; either version 2 of the
15 * License, or (at your option) any later version.
17 * mLib is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU Library General Public License for more details.
22 * You should have received a copy of the GNU Library General Public
23 * License along with mLib; if not, write to the Free
24 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
28 /*----- Header files ------------------------------------------------------*/
34 /*----- Main code ---------------------------------------------------------*/
41 struct step
{ size_t s
; };
43 static void test_crc32(const struct tvec_reg
*in
, struct tvec_reg
*out
,
46 const struct step
*step
= ctx
;
47 const unsigned char *p
= in
[RM
].v
.bytes
.p
; size_t sz
= in
[RM
].v
.bytes
.sz
;
51 out
[RH
].v
.u
= crc32(0, p
, sz
);
53 for (h
= 0; sz
> step
->s
; p
+= step
->s
, sz
-= step
->s
)
54 h
= crc32(h
, p
, step
->s
);
55 out
[RH
].v
.u
= crc32(h
, p
, sz
);
59 static void bench_crc32(const struct tvec_reg
*in
, struct tvec_reg
*out
,
61 { crc32(0, in
[RM
].v
.bytes
.p
, in
[RM
].v
.bytes
.sz
); }
63 static void test_unihash(const struct tvec_reg
*in
, struct tvec_reg
*out
,
66 const struct step
*step
= ctx
;
68 const unsigned char *p
= in
[RM
].v
.bytes
.p
; size_t sz
= in
[RM
].v
.bytes
.sz
;
71 unihash_setkey(&ui
, in
[RK
].v
.u
);
73 out
[RH
].v
.u
= unihash(&ui
, p
, sz
);
75 for (h
= UNIHASH_INIT(&ui
); sz
> step
->s
; p
+= step
->s
, sz
-= step
->s
)
76 h
= unihash_hash(&ui
, h
, p
, step
->s
);
77 out
[RH
].v
.u
= unihash_hash(&ui
, h
, p
, sz
);
81 static void bench_unihash(const struct tvec_reg
*in
, struct tvec_reg
*out
,
83 { unihash_hash(ctx
, 0, in
[RM
].v
.bytes
.p
, in
[RM
].v
.bytes
.sz
); }
85 static int setup_unihash(const struct tvec_reg
*in
, struct tvec_reg
*out
,
86 const union tvec_misc
*arg
, void *ctx
)
87 { unihash_setkey(ctx
, 0); return (0); }
89 static int run_step(struct tvec_state
*tv
)
91 static const size_t steps
[] = { 1, 5, 6, 7, 8, 23 };
95 tv
->test
->fn(tv
->in
, tv
->out
, 0);
96 tvec_check(tv
, "whole buffer");
98 for (i
= 0; i
< N(steps
); i
++) {
100 tv
->test
->fn(tv
->in
, tv
->out
, &step
);
101 tvec_check(tv
, "step = %lu", (unsigned long)steps
[i
]);
106 static const struct tvec_regdef unihash_regs
[] = {
107 { "k", RK
, &tvty_uint
, 0, { &tvrange_u32
} },
108 { "m", RM
, &tvty_bytes
, 0 },
109 { "h", RH
, &tvty_uint
, 0, { &tvrange_u32
} },
113 static const struct tvec_regdef crc32_regs
[] = {
114 { "m", RM
, &tvty_bytes
, 0 },
115 { "h", RH
, &tvty_uint
, 0, { &tvrange_u32
} },
119 static const struct tvec_regdef bench_regs
[] = {
120 { "msz", RM
, &tvty_buffer
, TVRF_ID
},
124 static const struct tvec_bench crc32_bench
= {
129 static const struct tvec_bench unihash_bench
= {
131 sizeof(unihash_info
), setup_unihash
, 0, 0, { 0 }
134 static const struct tvec_test tests
[] = {
135 { "crc32",crc32_regs
, 0, run_step
, test_crc32
},
136 { "unihash", unihash_regs
, 0, run_step
, test_unihash
},
137 { "crc32-bench", bench_regs
, 0,
138 tvec_bench
, bench_crc32
, { &crc32_bench
} },
139 { "unihash-bench", bench_regs
, 0,
140 tvec_bench
, bench_unihash
, { &unihash_bench
} },
144 static const struct tvec_info testinfo
=
145 { tests
, NROUT
, NREG
, sizeof(struct tvec_reg
) };
147 int main(int argc
, char *argv
[])
148 { return (tvec_main(argc
, argv
, &testinfo
, 0)); }
150 /*----- That's all, folks -------------------------------------------------*/