59
var _ Counter = (*cmSketch)(nil)
60
61
>
func NewCMSketchCounter(params CMSketchParams, src rand.Source, topKProvider topKFunc) *cmSketch {
cmsketch.go
62
>
params.D = max(1, params.D)
63
>
params.W = max(1, params.W)
64
>
params.Grow.SkipRateDecay = max(1_000, params.Grow.SkipRateDecay)
65
>
numRows := params.D + 1 // + 1 for shadow row
66
>
return &cmSketch{
67
>
params: params,
68
>
seed0: maphash.MakeSeed(),
69
>
seeds: makeSeeds(numRows, src),
70
>
cells: make([]uint32, params.W*numRows),
71
>
shadowRow: 0,
72
>
src: src,
73
>
topKProvider: topKProvider,
74
>
}
75
>
}
76
77
>
func (s *cmSketch) GetPass(key string, base, inc int64) int64 {
cmsketch.go
78
>
if inc < 0 {
79
return base // we don't handle negatives here
80
}
81
83
>
indexes := make([]int, numRows)
84
>
s.fillIndexes(key, indexes)
85
>
86
>
current := s.getByIndexes(indexes)
87
>
pass := max(base, current+inc)
88
>
s.skips += s.ensureByIndexes(indexes, pass)
89
>
90
>
if s.incs++; s.incs > s.params.Grow.SkipRateDecay {
91
s.maybeGrow()
92
s.skips >>= 1