Browse Source

add python interface

master
wes 7 years ago
parent
commit
2ffb03e198
  1. 7
      Makefile
  2. 7
      bfilter.c
  3. BIN
      bfilter.o
  4. 63
      bfilter.py
  5. BIN
      bfilter.so

7
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;

7
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

BIN
bfilter.o

Binary file not shown.

63
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)

BIN
bfilter.so

Binary file not shown.
Loading…
Cancel
Save