aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lib/third_party/src/hll/hll.c91
1 files changed, 49 insertions, 42 deletions
diff --git a/src/lib/third_party/src/hll/hll.c b/src/lib/third_party/src/hll/hll.c
index b9d61f21c..a7006c7ed 100644
--- a/src/lib/third_party/src/hll/hll.c
+++ b/src/lib/third_party/src/hll/hll.c
@@ -82,21 +82,26 @@ int hll_init(struct ndpi_hll *hll, u_int8_t bits) {
}
void hll_destroy(struct ndpi_hll *hll) {
- ndpi_free(hll->registers);
-
- hll->registers = NULL;
+ if(hll->registers) {
+ ndpi_free(hll->registers);
+
+ hll->registers = NULL;
+ }
}
void hll_reset(struct ndpi_hll *hll) {
- memset(hll->registers, 0, hll->size);
+ if(hll->registers)
+ memset(hll->registers, 0, hll->size);
}
static __inline void _hll_add_hash(struct ndpi_hll *hll, u_int32_t hash) {
- u_int32_t index = hash >> (32 - hll->bits);
- u_int8_t rank = _hll_rank(hash, hll->bits);
-
- if(rank > hll->registers[index]) {
- hll->registers[index] = rank;
+ if(hll->registers) {
+ u_int32_t index = hash >> (32 - hll->bits);
+ u_int8_t rank = _hll_rank(hash, hll->bits);
+
+ if(rank > hll->registers[index]) {
+ hll->registers[index] = rank;
+ }
}
}
@@ -107,46 +112,48 @@ void hll_add(struct ndpi_hll *hll, const void *buf, size_t size) {
}
double hll_count(const struct ndpi_hll *hll) {
- double alpha_mm;
- u_int32_t i;
-
- switch (hll->bits) {
- case 4:
- alpha_mm = 0.673;
- break;
- case 5:
- alpha_mm = 0.697;
- break;
- case 6:
- alpha_mm = 0.709;
- break;
- default:
- alpha_mm = 0.7213 / (1.0 + 1.079 / (double)hll->size);
- break;
- }
+ if(hll->registers) {
+ double alpha_mm, sum, estimate;
+ u_int32_t i;
- alpha_mm *= ((double)hll->size * (double)hll->size);
+ switch(hll->bits) {
+ case 4:
+ alpha_mm = 0.673;
+ break;
+ case 5:
+ alpha_mm = 0.697;
+ break;
+ case 6:
+ alpha_mm = 0.709;
+ break;
+ default:
+ alpha_mm = 0.7213 / (1.0 + 1.079 / (double)hll->size);
+ break;
+ }
- double sum = 0;
- for(i = 0; i < hll->size; i++) {
- sum += 1.0 / (1 << hll->registers[i]);
- }
+ alpha_mm *= ((double)hll->size * (double)hll->size);
+
+ sum = 0;
+ for(i = 0; i < hll->size; i++)
+ sum += 1.0 / (1 << hll->registers[i]);
- double estimate = alpha_mm / sum;
+ estimate = alpha_mm / sum;
- if (estimate <= 5.0 / 2.0 * (double)hll->size) {
- int zeros = 0;
+ if(estimate <= (5.0 / 2.0 * (double)hll->size)) {
+ int zeros = 0;
- for(i = 0; i < hll->size; i++)
- zeros += (hll->registers[i] == 0);
+ for(i = 0; i < hll->size; i++)
+ zeros += (hll->registers[i] == 0);
- if(zeros)
- estimate = (double)hll->size * log((double)hll->size / zeros);
+ if(zeros)
+ estimate = (double)hll->size * log((double)hll->size / zeros);
- } else if (estimate > (1.0 / 30.0) * 4294967296.0) {
- estimate = -4294967296.0 * log(1.0 - (estimate / 4294967296.0));
- }
+ } else if(estimate > ((1.0 / 30.0) * 4294967296.0)) {
+ estimate = -4294967296.0 * log(1.0 - (estimate / 4294967296.0));
+ }
- return estimate;
+ return estimate;
+ } else
+ return(0.);
}