xref: /dragonfly/sbin/hammer/test_dupkey.c (revision 9348a738)
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 
82