48 lines
		
	
	
		
			708 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			708 B
		
	
	
	
		
			Go
		
	
	
	
	
	
package chain
 | 
						|
 | 
						|
type BloomFilter struct {
 | 
						|
	bin []byte
 | 
						|
}
 | 
						|
 | 
						|
func NewBloomFilter(bin []byte) *BloomFilter {
 | 
						|
	if bin == nil {
 | 
						|
		bin = make([]byte, 256)
 | 
						|
	}
 | 
						|
 | 
						|
	return &BloomFilter{
 | 
						|
		bin: bin,
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (self *BloomFilter) Set(addr []byte) {
 | 
						|
	if len(addr) < 8 {
 | 
						|
		chainlogger.Warnf("err: bloom set to small: %x\n", addr)
 | 
						|
 | 
						|
		return
 | 
						|
	}
 | 
						|
 | 
						|
	for _, i := range addr[len(addr)-8:] {
 | 
						|
		self.bin[i] = 1
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (self *BloomFilter) Search(addr []byte) bool {
 | 
						|
	if len(addr) < 8 {
 | 
						|
		chainlogger.Warnf("err: bloom search to small: %x\n", addr)
 | 
						|
 | 
						|
		return false
 | 
						|
	}
 | 
						|
 | 
						|
	for _, i := range addr[len(addr)-8:] {
 | 
						|
		if self.bin[i] == 0 {
 | 
						|
			return false
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return true
 | 
						|
}
 | 
						|
 | 
						|
func (self *BloomFilter) Bin() []byte {
 | 
						|
	return self.bin
 | 
						|
}
 |