cfilter

Cuckoo Filter implementation in Go, better than Bloom Filters (unmaintained)

Github星跟蹤圖

cfilter: Cuckoo Filter implementation in Go

GoDoc
Build Status
Coverage Status
Go Report Card

Cuckoo filter is a Bloom filter replacement for approximated set-membership
queries. Cuckoo filters support adding and removing items dynamically while
achieving even higher performance than Bloom filters. For applications that
store many items and target moderately low false positive rates, cuckoo filters
have lower space overhead than space-optimized Bloom filters.
Some possible use-cases that depend on approximated set-membership queries
would be databases, caches, routers, and storage systems where it is used to
decide if a given item is in a (usually large) set, with some small false
positive probability. Alternatively, given it is designed to be a viable
replacement to Bloom filters, it can also be used to reduce the space required
in probabilistic routing tables, speed longest-prefix matching for IP
addresses, improve network state management and monitoring, and encode
multicast forwarding information in packets, among many other applications.

Cuckoo filters provide the flexibility to add and remove items dynamically. A
cuckoo filter is based on cuckoo hashing (and therefore named as cuckoo
filter). It is essentially a cuckoo hash table storing each key's fingerprint.
Cuckoo hash tables can be highly compact, thus a cuckoo filter could use less
space than conventional Bloom filters, for applications that require low false
positive rates (< 3%).

For details about the algorithm and citations please refer to the original
research paper, "Cuckoo Filter: Better Than Bloom" by Bin Fan, Dave Andersen
and Michael Kaminsky
.

Interface

A cuckoo filter supports following operations:

  • Insert(item): insert an item to the filter
  • Lookup(item): return if item is already in the filter (may return false
    positive results like Bloom filters)
  • Delete(item): delete the given item from the filter. Note that to use this
    method, it must be ensured that this item is in the filter (e.g., based on
    records on external storage); otherwise, a false item may be deleted.
  • Count(): return the total number of items currently in the filter

Example Usage

import "github.com/irfansharif/cfilter"

cf := cfilter.New()

// inserts 'buongiorno' to the filter
cf.Insert([]byte("buongiorno"))

// looks up 'hola' in the filter, may return false positive
cf.Lookup([]byte("hola"))

// returns 1 (given only 'buongiorno' was added)
cf.Count()

// tries deleting 'bonjour' from filter, may delete another element
// this could occur when another byte slice with the same fingerprint
// as another is 'deleted'
cf.Delete([]byte("bonjour"))

This repository was featured on Hacker News, front page (discussion
here). Another implementation
in Go can be found at
seiflotfy/cuckoofilter and is where I borrowed
the ideas for my tests, notably TestMultipleInsertions. The original
implementation in C++ by the authors of the research paper can be found at
efficient/cuckoofilter.

Author

Irfan Sharif: irfanmahmoudsharif@gmail.com, @irfansharifm

License

cfilter source code is available under the MIT License.

主要指標

概覽
名稱與所有者irfansharif/cfilter
主編程語言Go
編程語言Go (語言數: 1)
平台
許可證MIT License
所有者活动
創建於2016-07-22 06:54:14
推送於2017-07-05 17:34:18
最后一次提交2017-07-05 19:34:18
發布數2
最新版本名稱v0.1.1 (發布於 )
第一版名稱v0.1.0 (發布於 )
用户参与
星數760
關注者數18
派生數31
提交數15
已啟用問題?
問題數8
打開的問題數0
拉請求數5
打開的拉請求數0
關閉的拉請求數0
项目设置
已啟用Wiki?
已存檔?
是復刻?
已鎖定?
是鏡像?
是私有?