]> git.ozlabs.org Git - ccan/blobdiff - ccan/hash/test/run.c
hash: fix overrun in test code.
[ccan] / ccan / hash / test / run.c
index 1857739af5931f7044d2b0a4195ffb3ba1e333a3..dad8e86b9e53bf1ccab0e3a655f647a8b5ac43db 100644 (file)
@@ -1,6 +1,6 @@
-#include "hash/hash.h"
-#include "tap/tap.h"
-#include "hash/hash.c"
+#include <ccan/hash/hash.h>
+#include <ccan/tap/tap.h>
+#include <ccan/hash/hash.c>
 #include <stdbool.h>
 #include <string.h>
 
@@ -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;