BloomFilter Experiments
github.com
github.com
The Power of Simple Tabulation Hashing: http://people.csail.mit.edu/mip/papers/charhash/charhash.pdf
1) Independent variable (thing you are changing) is usually on the x axis and dependent variable (thing you are measuring) is usually on the y axis. Having the two flipped requires a confusing in-head translation among people who look at graphs regularly.
2) Your plotting software is not plotting your line graph in monotonically changing fashion. This gives zig zags where the graph goes backwards. Addressing #1 could help or plot as a scatter plot ("." option in matplotlib).
3) A detailed description of parameters under the plot would also be nice.
Regardless this is a cool example of bloom filters in action. Thank you!
That's super interesting!
I wonder what kinds of stuff you could do with that in a fancy datastore like Elasticsearch or GraphDB.
If it could be mapped to a resource model in a straightforward way, it'd be fun to make a special "ORM" that plugs into an API framework to expose public services.
Take bup (https://github.com/bup/bup/) for instance. It splits your content into chunks and stores them into GB-sized packs. With large backups you easily end up in hundreds of packs. During the splitting process it needs to search for a hash (the needle) into the huge amount of chunks (the haystack). That's why bup has one bloom filter per pack, which means that instead of searching through hundreds of packs you will have to search through maybe 2 or 3 packs. There are false positives (you know a hash can only realistically be contained in a single pack) but it is you the developer who choose how much you want. There is some complicated math that allows you to balance false positives, size of the structure, and expected number of elements.
There's a similar process inside LevelDB (http://leveldb.org/) and it's going to be the same thing for systems that store their data in multiple parts and know that what they're looking for actually is in a single part.
Some interesting use cases around them for very high performance filtering operations, but probably overkill and overthink for the vast majority of issues out there. It's something you'd generally looking at if you were trying to performance tune a lot of checks against a big dataset.
There's lots of simplification in the above analysis (ignoring multiple paths to the same host, etc., etc.) but you get the gist of it.
(This assumes a query for some really rare keyword... the peers use sampling of their nearest neighbors to first estimate the hop count they need in order to get a target number of search results... so searches for popular keywords are unlikely to be helped by the Bloom filter, but they're also sent with a low hop count.)