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