antireplay.go 988 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package antireplay
  2. import (
  3. "sync"
  4. "time"
  5. cuckoo "github.com/seiflotfy/cuckoofilter"
  6. )
  7. func NewAntiReplayWindow(antiReplayTime int64) *AntiReplayWindow {
  8. arw := &AntiReplayWindow{}
  9. arw.AntiReplayTime = antiReplayTime
  10. return arw
  11. }
  12. type AntiReplayWindow struct {
  13. lock sync.Mutex
  14. poolA *cuckoo.Filter
  15. poolB *cuckoo.Filter
  16. lastSwapTime int64
  17. PoolSwap bool
  18. AntiReplayTime int64
  19. }
  20. func (aw *AntiReplayWindow) Check(sum []byte) bool {
  21. aw.lock.Lock()
  22. if aw.lastSwapTime == 0 {
  23. aw.lastSwapTime = time.Now().Unix()
  24. aw.poolA = cuckoo.NewFilter(100000)
  25. aw.poolB = cuckoo.NewFilter(100000)
  26. }
  27. tnow := time.Now().Unix()
  28. timediff := tnow - aw.lastSwapTime
  29. if timediff >= aw.AntiReplayTime {
  30. if aw.PoolSwap {
  31. aw.PoolSwap = false
  32. aw.poolA.Reset()
  33. } else {
  34. aw.PoolSwap = true
  35. aw.poolB.Reset()
  36. }
  37. aw.lastSwapTime = tnow
  38. }
  39. ret := aw.poolA.InsertUnique(sum) && aw.poolB.InsertUnique(sum)
  40. aw.lock.Unlock()
  41. return ret
  42. }