func (s *SBFFrame) Add(conn redis.Conn, element []byte) bool { hashes := murmur.Hashes(element, s.SliceCount, s.SliceSize) // update bit val conn.Send("MULTI") for index, h := range hashes { pos := uint32(index)*s.SliceSize + s.StartIndex + h + SBF_FRAME_HEADER_SIZE<<3 conn.Send("SETBIT", s.Refer, pos, 1) } conn.Send("INCR", s.Key) _, err := conn.Do("EXEC") if err == nil { s.Count += 1 return true } else { return false } }
func (s *SBFFrame) Check(conn redis.Conn, element []byte) bool { var flag int = 1 hashes := murmur.Hashes(element, s.SliceCount, s.SliceSize) // check bit val conn.Send("MULTI") for index, h := range hashes { pos := uint32(index)*s.SliceSize + s.StartIndex + h + SBF_FRAME_HEADER_SIZE<<3 conn.Send("GETBIT", s.Refer, pos) } if data, err := redis.Ints(conn.Do("EXEC")); err == nil { for _, f := range data { flag = flag & f if flag != 1 { return false } } return (flag == 1) } else { return false } }