xref: /dragonfly/sbin/hammer/test_dupkey.c (revision e6e77800)
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 		*ptr |= mask;
38 		++count;
39 	}
40 	printf("duplicate found at count %d key %08x\n", count, key);
41 	printf("'%s' and", name);
42 	saved = key;
43 
44 	srandom(0);
45 	count = 0;
46 	for (;;) {
47 		randomname(name);
48 		key = namekey(name);
49 		if (saved == key)
50 			break;
51 		++count;
52 	}
53 	printf(" '%s'\n", name);
54 
55 	return(0);
56 }
57 
58 static
59 uint32_t
60 namekey(const char *name)
61 {
62 	uint32_t key;
63 
64 	key = crc32(name, strlen(name)) & 0x7FFFFFFF;
65 	if (key == 0)
66 		key = 1;
67 	return(key);
68 }
69 
70 static
71 void
72 randomname(char *name)
73 {
74 	int len = random() % 16 + 8;
75 	int i;
76 
77 	for (i = 0; i < len; ++i)
78 		name[i] = random() % 26 + 'a';
79 	name[i] = 0;
80 }
81 
82 
83