sbin/hammer: Minor fix for hammer(8) manpage
[dragonfly.git] / sbin / hammer / test_dupkey.c
1 /*
2  * This is a really simple stupid standalone program which will find two
3  * filenames with the same CRC, used to test the directory iterator.
4  *
5  * cc -I /usr/src/sys test_dupkey.c /usr/src/sys/libkern/crc32.c \
6  * /usr/src/sys/libkern/icrc32.c -o test_dupkey
7  *
8  * $DragonFly: src/sbin/hammer/test_dupkey.c,v 1.1 2008/06/26 04:07:57 dillon Exp $
9  */
10
11 #include "hammer_util.h"
12
13 static uint32_t namekey(const char *name);
14 static void randomname(char *name);
15
16 uint32_t bitmap[0x80000000U / 32];
17
18 int
19 main(int ac, char **av)
20 {
21         char name[32];
22         uint32_t key;
23         uint32_t *ptr;
24         uint32_t mask;
25         uint32_t count;
26         uint32_t saved;
27
28         srandom(0);     /* reproducable random sequence number */
29         count = 0;
30         for (;;) {
31                 randomname(name);
32                 key = namekey(name);
33                 ptr = &bitmap[key / 32];
34                 mask = 1 << (key & 31);
35                 if (*ptr & mask) {
36                         break;
37                 }
38                 *ptr |= mask;
39                 ++count;
40         }
41         printf("duplicate found at count %d key %08x\n", count, key);
42         printf("'%s' and", name);
43         saved = key;
44
45         srandom(0);
46         count = 0;
47         for (;;) {
48                 randomname(name);
49                 key = namekey(name);
50                 if (saved == key)
51                         break;
52                 ++count;
53         }
54         printf(" '%s'\n", name);
55 }
56
57 static
58 uint32_t
59 namekey(const char *name)
60 {
61         uint32_t key;
62
63         key = crc32(name, strlen(name)) & 0x7FFFFFFF;
64         if (key == 0)
65                 key = 1;
66         return(key);
67 }
68
69 static
70 void
71 randomname(char *name)
72 {
73         int len = random() % 16 + 8;
74         int i;
75
76         for (i = 0; i < len; ++i)
77                 name[i] = random() % 26 + 'a';
78         name[i] = 0;
79 }
80
81