// Copyright 2013 The LevelDB-Go Authors. All rights reserved.// Use of this source code is governed by a BSD-style// license that can be found in the LICENSE file.package yimport// Filter is an encoded set of []byte keys.typeFilter []bytefunc ( Filter) ( []byte) bool {return .MayContain(Hash())}// MayContain returns whether the filter may contain given key. False positives// are possible, where it returns true for keys not in the original set.func ( Filter) ( uint32) bool {iflen() < 2 {returnfalse } := [len()-1]if > 30 {// This is reserved for potentially new encodings for short Bloom filters. // Consider it a match.returntrue } := uint32(8 * (len() - 1)) := >>17 | <<15for := uint8(0); < ; ++ { := % if [/8]&(1<<(%8)) == 0 {returnfalse } += }returntrue}// NewFilter returns a new Bloom filter that encodes a set of []byte keys with// the given number of bits per key, approximately.//// A good bitsPerKey value is 10, which yields a filter with ~ 1% false// positive rate.func ( []uint32, int) Filter {returnFilter(appendFilter(nil, , ))}// BloomBitsPerKey returns the bits per key required by bloomfilter based on// the false positive rate.func ( int, float64) int { := -1 * float64() * math.Log() / math.Pow(float64(0.69314718056), 2) := math.Ceil(float64(0.69314718056) * / float64())returnint()}func appendFilter( []byte, []uint32, int) []byte {if < 0 { = 0 }// 0.69 is approximately ln(2). := uint32(float64() * 0.69)if < 1 { = 1 }if > 30 { = 30 } := len() * // For small len(keys), we can see a very high false positive rate. Fix it // by enforcing a minimum bloom filter length.if < 64 { = 64 } := ( + 7) / 8 = * 8 , := extend(, +1)for , := range { := >>17 | <<15for := uint32(0); < ; ++ { := % uint32() [/8] |= 1 << ( % 8) += } } [] = uint8()return}// extend appends n zero bytes to b. It returns the overall slice (of length// n+len(originalB)) and the slice of n trailing zeroes.func extend( []byte, int) (, []byte) { := + len()if <= cap() { = [:] = [len():]for := range { [] = 0 } } else {// Grow the capacity exponentially, with a 1KiB minimum. := 1024for < { += / 4 } = make([]byte, , ) = [len():]copy(, ) }return , }// hash implements a hashing algorithm similar to the Murmur hash.func ( []byte) uint32 {const ( = 0xbc9f1d34 = 0xc6a4a793 ) := uint32() ^ uint32(len())*for ; len() >= 4; = [4:] { += uint32([0]) | uint32([1])<<8 | uint32([2])<<16 | uint32([3])<<24 *= ^= >> 16 }switchlen() {case3: += uint32([2]) << 16fallthroughcase2: += uint32([1]) << 8fallthroughcase1: += uint32([0]) *= ^= >> 24 }return}// FilterPolicy implements the db.FilterPolicy interface from the leveldb/db// package.//// The integer value is the approximate number of bits used per key. A good// value is 10, which yields a filter with ~ 1% false positive rate.//// It is valid to use the other API in this package (leveldb/bloom) without// using this type or the leveldb/db package.// type FilterPolicy int// // Name implements the db.FilterPolicy interface.// func (p FilterPolicy) Name() string {// // This string looks arbitrary, but its value is written to LevelDB .ldb// // files, and should be this exact value to be compatible with those files// // and with the C++ LevelDB code.// return "leveldb.BuiltinBloomFilter2"// }// // AppendFilter implements the db.FilterPolicy interface.// func (p FilterPolicy) AppendFilter(dst []byte, keys [][]byte) []byte {// return appendFilter(dst, keys, int(p))// }// // MayContain implements the db.FilterPolicy interface.// func (p FilterPolicy) MayContain(filter, key []byte) bool {// return Filter(filter).MayContain(key)// }
The pages are generated with Goldsv0.8.4. (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu.
PR and bug reports are welcome and can be submitted to the issue list.
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds.