void algorithm_init(struct md5_table *md5) { uint32_t i; if (hash_init(md5->num) != 0) { printf("hash init failed\n"); exit(1); } for (i = 0; i < md5->num; i++) hash_put((uint8_t *)(md5->key + i), i); hash_dump(); if (cuckoo_filter_init(md5) != 0) { printf("cuckoo init failed\n"); exit(1); } for (i = 0; i < md5->num; i++) cuckoo_filter_put((uint8_t *)(md5->key + i), &i); cuckoo_filter_dump(); if (bloom_filter_init(2500000) != 0) { printf("bloom init failed\n"); exit(1); } for (i = 0; i < md5->num; i++) bloom_filter_put((uint8_t *)(md5->key + i)); bloom_filter_dump(); }
int main(int argc, char **argv) { SHA_CTX c; struct stat st; uint32_t key_num; uint8_t *keys; uint8_t **sha1_key; uint8_t value[DAT_LEN], *v; int bytes, i, j; FILE *f1, *f2; if (argc < 3) { fprintf(stderr, "usage: ./cuckoo_filter read_file write_file\n"); exit(-1); } --argc; ++argv; f1 = fopen(argv[0], "rb"); if (f1 == NULL) { fprintf(stderr, "Fail to open %s!\n", argv[0]); exit(-1); } stat(argv[0], &st); f2 = fopen(argv[1], "wb+"); if (f2 == NULL) { fprintf(stderr, "Fail to open %s!\n", argv[1]); exit(-1); } /* Initialization */ cuckoo_filter_init(st.st_size); /* Allocate SHA1 key space */ key_num = next_pow_of_2(st.st_size) / DAT_LEN; keys = malloc(key_num * 20); sha1_key = malloc(key_num * sizeof(void *)); if (!keys || !sha1_key) { fprintf(stderr, "Out of memory!\n"); exit(-1); } for (i = 0; i < key_num; i++) { sha1_key[i] = keys + i * 20; } /* Put read_file into log on flash. */ i = 0; do { memset(value, 0, DAT_LEN); bytes = fread(value, 1, DAT_LEN, f1); SHA1_Init(&c); SHA1_Update(&c, value, bytes); SHA1_Final(sha1_key[i], &c); cuckoo_filter_put(sha1_key[i], value); i++; } while (bytes == DAT_LEN); /* Real key number */ key_num = i; printf("Total %u records.\n", key_num); /* Deletion test */ for (i = 0; i < key_num; i += 2) { cuckoo_filter_put(sha1_key[i], NULL); } for (i = 0; i < key_num; i++) { memset(value, 0, DAT_LEN); bytes = fread(value, 1, DAT_LEN, f1); if (!(i & 0x1)) { cuckoo_filter_put(sha1_key[i], value); } } /* Get logs on flash and write them into a new file. */ for (j = 0; j < key_num; j++) { v = cuckoo_filter_get(sha1_key[j]); if (v != NULL) { memcpy(value, v, DAT_LEN); fwrite(value, 1, DAT_LEN, f2); } } fclose(f1); fclose(f2); return 0; }