diff --git a/Makefile b/Makefile index 8106a8c..d64d712 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,6 @@ default: bfilter.c bfilter.h - $(CC) -g -DTOK_LIB -Wall -Wextra -std=gnu99 -Wpointer-arith -Wmissing-prototypes -lm -L. -O3 ./bfilter.c -o test --static `pkg-config --libs --cflags libfnv` -Wl,-rpath,/home/wes/bfilter; + $(CC) -g -Wall -Wextra -std=gnu99 -Wpointer-arith -Wmissing-prototypes -lm -L. -O3 ./bfilter.c -o test --static `pkg-config --libs --cflags libfnv` -Wl,-rpath,/home/wes/bfilter; -unsafe: bfilter.c bfilter.h - $(CC) -DNDEBUG -DTOK_LIB -Wall -std=gnu99 -Wextra -Wpointer-arith -Wmissing-prototypes -lm -L. -O3 ./bfilter.c -o bfilter -Wl,-rpath,/home/wes/bfilter; +lib: bfilter.c bfilter.h + $(CC) -g -DLIB -c -fpic -Wall -Wextra -pedantic -Wpointer-arith -Werror -std=c99 -lm -L. -O3 ./bfilter.c --static `pkg-config --libs --cflags libfnv` -Wl,-rpath,/home/wes/bfilter; + $(CC) -shared -o bfilter.so bfilter.o; diff --git a/bfilter.c b/bfilter.c index 01fc264..cf5887c 100644 --- a/bfilter.c +++ b/bfilter.c @@ -7,7 +7,6 @@ int printbits(uint32_t n, size_t c) { uint32_t i = c-1; - while (n >= 2) { printf("%d", n & 1); i--; @@ -150,7 +149,7 @@ bfilter_set(bit_array_t *filter, int k) { hashes_t hashes = hash(key, k, filter->num_elems); - for(int i = 0; i < 5; i++) { + for(int i = 0; i < k; i++) { setbit(filter, hashes[i]); } return 0; @@ -164,7 +163,7 @@ bfilter_get(bit_array_t *filter, int exists = 1; - for(int i = 0; i < 5; i++) { + for(int i = 0; i < k; i++) { if (!getbit(filter, hashes[i])) { exists = 0; } @@ -172,6 +171,7 @@ bfilter_get(bit_array_t *filter, return exists; } +#ifndef LIB int main (void) { bit_array_t *test = empty_bfilter(4000); @@ -213,3 +213,4 @@ main (void) { return EXIT_SUCCESS; } +#endif diff --git a/bfilter.o b/bfilter.o new file mode 100644 index 0000000..132ba8c Binary files /dev/null and b/bfilter.o differ diff --git a/bfilter.py b/bfilter.py new file mode 100755 index 0000000..04fb5b3 --- /dev/null +++ b/bfilter.py @@ -0,0 +1,63 @@ +#! /usr/bin/env python3 + +from cffi import FFI +from sys import stdout + +ffi = FFI() + +lib = ffi.dlopen("./bfilter.so") + +ffi.cdef(""" +typedef + struct { + size_t num_elems; + size_t num_ints; + uint32_t *arr; + } + bit_array_t; + +typedef + struct { + uint32_t hash_1; + uint32_t hash_2; + } + fnv_hashes_t; + +typedef uint32_t* hashes_t; + +int printbits(uint32_t, size_t); + +int print_barray(bit_array_t*); + +bit_array_t* empty_bfilter(int); + +fnv_hashes_t hash_fnv(const char*); + +uint32_t kth_hash(fnv_hashes_t, uint32_t, size_t); + +hashes_t hash(const char *, uint32_t, size_t); + +int setbit(bit_array_t*, int); +int unsetbit(bit_array_t*, int); + +int bfilter_set(bit_array_t *, const char*, int); +int bfilter_get(bit_array_t *, const char*, int); + +int getbit(bit_array_t *, int); +""") + +bfilter = lib.empty_bfilter(190) + +k = 10 + +with open("./roadnottaken") as rnt: + words = rnt.read().split(" ") + for word in words: + lib.bfilter_set(bfilter, word.encode("UTF-8"), k) + + for word in words: + print(lib.bfilter_get(bfilter, word.encode("UTF-8"), k)) + + print(lib.bfilter_get(bfilter, b"wes", k)) + +# lib.print_barray(bfilter) diff --git a/bfilter.so b/bfilter.so new file mode 100755 index 0000000..1a3d503 Binary files /dev/null and b/bfilter.so differ