From 4f5d02f5b3ba468650558de5ae01200df561b6bd Mon Sep 17 00:00:00 2001 From: Sung-Ho Lee Date: Mon, 13 May 2019 10:37:48 +0900 Subject: [PATCH 1/2] HyperLogLog.add() have a return value. --- .../java/com/facebook/stats/cardinality/HyperLogLog.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/stats/src/main/java/com/facebook/stats/cardinality/HyperLogLog.java b/stats/src/main/java/com/facebook/stats/cardinality/HyperLogLog.java index 36922681..9816b879 100644 --- a/stats/src/main/java/com/facebook/stats/cardinality/HyperLogLog.java +++ b/stats/src/main/java/com/facebook/stats/cardinality/HyperLogLog.java @@ -66,12 +66,13 @@ public HyperLogLog(int[] buckets) { } } - public void add(long value) { + /** + * @return true if the buckets are updated + */ + public boolean add(long value) { BucketAndHash bucketAndHash = BucketAndHash.fromHash(computeHash(value), buckets.length); int bucket = bucketAndHash.getBucket(); - int lowestBitPosition = Long.numberOfTrailingZeros(bucketAndHash.getHash()) + 1; - int previous = buckets[bucket]; if (previous == 0) { @@ -83,7 +84,9 @@ public void add(long value) { currentSum += 1.0 / (1L << lowestBitPosition); buckets[bucket] = (byte) lowestBitPosition; + return true; } + return false; } public long estimate() { From a06655d724024654a7cb345e337d61d92675bbaf Mon Sep 17 00:00:00 2001 From: Sung-Ho Lee Date: Mon, 13 May 2019 13:36:06 +0900 Subject: [PATCH 2/2] properties of HyperLogLog become protected. --- .../java/com/facebook/stats/cardinality/HyperLogLog.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/stats/src/main/java/com/facebook/stats/cardinality/HyperLogLog.java b/stats/src/main/java/com/facebook/stats/cardinality/HyperLogLog.java index 9816b879..b4a1f0ea 100644 --- a/stats/src/main/java/com/facebook/stats/cardinality/HyperLogLog.java +++ b/stats/src/main/java/com/facebook/stats/cardinality/HyperLogLog.java @@ -28,12 +28,12 @@ */ @NotThreadSafe public class HyperLogLog { - private final byte[] buckets; + protected final byte[] buckets; // The current sum of 1 / (1L << buckets[i]). Updated as new items are added and used for // estimation - private double currentSum; - private int nonZeroBuckets = 0; + protected double currentSum; + protected int nonZeroBuckets = 0; public HyperLogLog(int numberOfBuckets) { Preconditions.checkArgument(