| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- package antireplay
- import (
- cuckoo "github.com/seiflotfy/cuckoofilter"
- "sync"
- "time"
- )
- func NewAntiReplayWindow(AntiReplayTime int64) *AntiReplayWindow {
- arw := &AntiReplayWindow{}
- arw.AntiReplayTime = AntiReplayTime
- return arw
- }
- type AntiReplayWindow struct {
- lock sync.Mutex
- poolA *cuckoo.Filter
- poolB *cuckoo.Filter
- lastSwapTime int64
- PoolSwap bool
- AntiReplayTime int64
- }
- func (aw *AntiReplayWindow) Check(sum []byte) bool {
- aw.lock.Lock()
- if aw.lastSwapTime == 0 {
- aw.lastSwapTime = time.Now().Unix()
- aw.poolA = cuckoo.NewFilter(100000)
- aw.poolB = cuckoo.NewFilter(100000)
- }
- tnow := time.Now().Unix()
- timediff := tnow - aw.lastSwapTime
- if timediff >= aw.AntiReplayTime {
- if aw.PoolSwap {
- aw.PoolSwap = false
- aw.poolA.Reset()
- } else {
- aw.PoolSwap = true
- aw.poolB.Reset()
- }
- aw.lastSwapTime = tnow
- }
- ret := aw.poolA.InsertUnique(sum) && aw.poolB.InsertUnique(sum)
- aw.lock.Unlock()
- return ret
- }
|