X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Fhash%2Ftest%2Frun.c;h=dad8e86b9e53bf1ccab0e3a655f647a8b5ac43db;hp=1857739af5931f7044d2b0a4195ffb3ba1e333a3;hb=c4c5fed020ba44b9930119672a36a1cb33aff090;hpb=a86b21063f9627872914961b651f97be0aadad12 diff --git a/ccan/hash/test/run.c b/ccan/hash/test/run.c index 1857739a..dad8e86b 100644 --- a/ccan/hash/test/run.c +++ b/ccan/hash/test/run.c @@ -1,6 +1,6 @@ -#include "hash/hash.h" -#include "tap/tap.h" -#include "hash/hash.c" +#include +#include +#include #include #include @@ -17,12 +17,12 @@ int main(int argc, char *argv[]) for (i = 0; i < ARRAY_WORDS; i++) array[i] = i; - plan_tests(22); + plan_tests(39); /* Hash should be the same, indep of memory alignment. */ - val = hash(array, sizeof(array), 0); + val = hash(array, ARRAY_WORDS, 0); for (i = 0; i < sizeof(uint32_t); i++) { memcpy(array2 + i, array, sizeof(array)); - ok(hash(array2 + i, sizeof(array), 0) != val, + ok(hash(array2 + i, ARRAY_WORDS, 0) != val, "hash matched at offset %i", i); } @@ -36,7 +36,33 @@ int main(int argc, char *argv[]) for (j = 0; j < 256000; j++) { for (k = 0; k < ARRAY_WORDS; k++) array[k] = random(); - results[(hash(array, sizeof(array), 0) >> i*8)&0xFF]++; + results[(hash(array, ARRAY_WORDS, 0) >> i*8)&0xFF]++; + } + + for (j = 0; j < 256; j++) { + if (results[j] < lowest) + lowest = results[j]; + if (results[j] > highest) + highest = results[j]; + } + /* Expect within 20% */ + ok(lowest > 800, "Byte %i lowest %i", i, lowest); + ok(highest < 1200, "Byte %i highest %i", i, highest); + diag("Byte %i, range %u-%u", i, lowest, highest); + } + + /* Hash of random values should have random distribution: + * check one byte at a time. */ + for (i = 0; i < sizeof(uint64_t); i++) { + unsigned int lowest = -1U, highest = 0; + + memset(results, 0, sizeof(results)); + + for (j = 0; j < 256000; j++) { + for (k = 0; k < ARRAY_WORDS; k++) + array[k] = random(); + results[(hash64(array, sizeof(array)/sizeof(uint64_t), + 0) >> i*8)&0xFF]++; } for (j = 0; j < 256; j++) { @@ -75,6 +101,13 @@ int main(int argc, char *argv[]) diag("hash_pointer byte %i, range %u-%u", i, lowest, highest); } + if (sizeof(long) == sizeof(uint32_t)) + ok1(hashl(array, ARRAY_WORDS, 0) + == hash(array, ARRAY_WORDS, 0)); + else + ok1(hashl(array, ARRAY_WORDS, 0) + == hash64(array, ARRAY_WORDS, 0)); + /* String hash: weak, so only test bottom byte */ for (i = 0; i < 1; i++) { unsigned int num = 0, cursor, lowest = -1U, highest = 0;