count_min_sketch.h 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #pragma once
  2. #include <util/system/types.h>
  3. #include <util/generic/strbuf.h>
  4. namespace NKikimr {
  5. class TCountMinSketch {
  6. private:
  7. ui64 Width;
  8. ui64 Depth;
  9. ui64 ElementCount;
  10. private:
  11. static ui64 Hash(const char* data, size_t size, size_t hashIndex);
  12. static size_t StaticSize(ui64 width, ui64 depth) {
  13. return sizeof(TCountMinSketch) + width * depth * sizeof(ui32);
  14. }
  15. const ui32* Buckets() const {
  16. return reinterpret_cast<const ui32*>(this + 1);
  17. }
  18. ui32* Buckets() {
  19. return reinterpret_cast<ui32*>(this + 1);
  20. }
  21. public:
  22. static TCountMinSketch* Create(ui64 width = 256, ui64 depth = 8);
  23. static TCountMinSketch* FromString(const char* data, size_t size);
  24. void operator delete(void* data) noexcept;
  25. TCountMinSketch() = delete;
  26. TCountMinSketch(const TCountMinSketch&) = delete;
  27. size_t GetSize() const {
  28. return StaticSize(Width, Depth);
  29. }
  30. size_t GetWidth() const {
  31. return Width;
  32. }
  33. size_t GetDepth() const {
  34. return Depth;
  35. }
  36. size_t GetElementCount() const {
  37. return ElementCount;
  38. }
  39. TStringBuf AsStringBuf() const {
  40. return TStringBuf(reinterpret_cast<const char*>(this), GetSize());
  41. }
  42. void Count(const char* data, size_t size);
  43. ui32 Probe(const char* data, size_t size) const;
  44. TCountMinSketch& operator+=(const TCountMinSketch& rhs);
  45. };
  46. static_assert(sizeof(TCountMinSketch) == 24);
  47. } // NKikimr