From 7a1b3f953923fa4da9a4eda8dec3a84e611a9cc5 Mon Sep 17 00:00:00 2001 From: Sid Date: Wed, 29 Aug 2018 14:16:19 +0800 Subject: [PATCH 1/7] Fix bitCount is 0 after intersect or union use the fact that after i & (i - 1), the right most of set bit of "i" will be unset ref: https://www.quora.com/How-do-you-count-the-number-of-1-bits-in-a-number-using-only-bitwise-operations --- .../bloomfilter/mutable/UnsafeBitArray.scala | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/bloom-filter/src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala b/bloom-filter/src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala index f8cd998..e632866 100644 --- a/bloom-filter/src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala +++ b/bloom-filter/src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala @@ -3,6 +3,7 @@ package bloomfilter.mutable import java.io._ import bloomfilter.util.Unsafe.unsafe +import scala.annotation.tailrec @SerialVersionUID(2L) class UnsafeBitArray(val numberOfBits: Long) extends Serializable { @@ -33,6 +34,7 @@ class UnsafeBitArray(val numberOfBits: Long) extends Serializable { val thatLong = unsafe.getLong(that.ptr + (index >>> 6) * 8L) val longAtIndex = combiner(thisLong, thatLong) unsafe.putLong(result.ptr + (index >>> 6) * 8L, longAtIndex) + result.addBitCount(UnsafeBitArray.getSetBit(longAtIndex)) index += 64 } result @@ -50,6 +52,10 @@ class UnsafeBitArray(val numberOfBits: Long) extends Serializable { combine(that, _ & _) } + def addBitCount(i: Long): Unit = { + bitCount += i + } + def getBitCount: Long = { bitCount } @@ -102,4 +108,16 @@ object UnsafeBitArray { private def readResolve: AnyRef = unsafeBitArray } + def getSetBit(i: Long): Long = { + @tailrec + def aux(i: Long, cnt: Long): Long = { + if (i == 0) { + cnt + } else { + aux(i & (i -1), cnt + 1) + } + } + + aux(i, 0) + } } From a5c4ab939611478c1942cebc477d9493bdc89943 Mon Sep 17 00:00:00 2001 From: Sid Date: Mon, 3 Sep 2018 15:53:40 +0800 Subject: [PATCH 2/7] wrong approximateElementCount() after union/intersection --- .../src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/bloom-filter/src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala b/bloom-filter/src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala index e632866..8af5e1c 100644 --- a/bloom-filter/src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala +++ b/bloom-filter/src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala @@ -34,7 +34,10 @@ class UnsafeBitArray(val numberOfBits: Long) extends Serializable { val thatLong = unsafe.getLong(that.ptr + (index >>> 6) * 8L) val longAtIndex = combiner(thisLong, thatLong) unsafe.putLong(result.ptr + (index >>> 6) * 8L, longAtIndex) - result.addBitCount(UnsafeBitArray.getSetBit(longAtIndex)) +// result.addBitCount(UnsafeBitArray.getSetBit(longAtIndex)) + if (longAtIndex > 0) { + result.addBitCount(1) + } index += 64 } result From 290d68f9e00c9d0497a21b52201972278a11ac61 Mon Sep 17 00:00:00 2001 From: Sid Date: Mon, 3 Sep 2018 15:57:30 +0800 Subject: [PATCH 3/7] remove unnecessary code --- .../scala/bloomfilter/mutable/UnsafeBitArray.scala | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/bloom-filter/src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala b/bloom-filter/src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala index 8af5e1c..ce7242b 100644 --- a/bloom-filter/src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala +++ b/bloom-filter/src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala @@ -34,7 +34,6 @@ class UnsafeBitArray(val numberOfBits: Long) extends Serializable { val thatLong = unsafe.getLong(that.ptr + (index >>> 6) * 8L) val longAtIndex = combiner(thisLong, thatLong) unsafe.putLong(result.ptr + (index >>> 6) * 8L, longAtIndex) -// result.addBitCount(UnsafeBitArray.getSetBit(longAtIndex)) if (longAtIndex > 0) { result.addBitCount(1) } @@ -110,17 +109,4 @@ object UnsafeBitArray { @throws(classOf[java.io.ObjectStreamException]) private def readResolve: AnyRef = unsafeBitArray } - - def getSetBit(i: Long): Long = { - @tailrec - def aux(i: Long, cnt: Long): Long = { - if (i == 0) { - cnt - } else { - aux(i & (i -1), cnt + 1) - } - } - - aux(i, 0) - } } From 730fef706657af8d0744c7eafb63bbebe4258b37 Mon Sep 17 00:00:00 2001 From: Sid Date: Mon, 3 Sep 2018 16:16:59 +0800 Subject: [PATCH 4/7] remove unused import --- .../src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala | 1 - 1 file changed, 1 deletion(-) diff --git a/bloom-filter/src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala b/bloom-filter/src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala index ce7242b..73c930a 100644 --- a/bloom-filter/src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala +++ b/bloom-filter/src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala @@ -3,7 +3,6 @@ package bloomfilter.mutable import java.io._ import bloomfilter.util.Unsafe.unsafe -import scala.annotation.tailrec @SerialVersionUID(2L) class UnsafeBitArray(val numberOfBits: Long) extends Serializable { From 8c38b4715d68e77f86e72f3cc3e09f13906a3ba3 Mon Sep 17 00:00:00 2001 From: Sid Date: Tue, 4 Sep 2018 10:34:23 +0800 Subject: [PATCH 5/7] Revert "remove unused import" This reverts commit 730fef706657af8d0744c7eafb63bbebe4258b37. --- .../src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala | 1 + 1 file changed, 1 insertion(+) diff --git a/bloom-filter/src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala b/bloom-filter/src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala index 73c930a..ce7242b 100644 --- a/bloom-filter/src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala +++ b/bloom-filter/src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala @@ -3,6 +3,7 @@ package bloomfilter.mutable import java.io._ import bloomfilter.util.Unsafe.unsafe +import scala.annotation.tailrec @SerialVersionUID(2L) class UnsafeBitArray(val numberOfBits: Long) extends Serializable { From cb3c432bc57bd3476777823b1c34cb3fd6bfe095 Mon Sep 17 00:00:00 2001 From: Sid Date: Tue, 4 Sep 2018 10:34:51 +0800 Subject: [PATCH 6/7] Revert "remove unnecessary code" This reverts commit 290d68f9e00c9d0497a21b52201972278a11ac61. --- .../scala/bloomfilter/mutable/UnsafeBitArray.scala | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/bloom-filter/src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala b/bloom-filter/src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala index ce7242b..8af5e1c 100644 --- a/bloom-filter/src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala +++ b/bloom-filter/src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala @@ -34,6 +34,7 @@ class UnsafeBitArray(val numberOfBits: Long) extends Serializable { val thatLong = unsafe.getLong(that.ptr + (index >>> 6) * 8L) val longAtIndex = combiner(thisLong, thatLong) unsafe.putLong(result.ptr + (index >>> 6) * 8L, longAtIndex) +// result.addBitCount(UnsafeBitArray.getSetBit(longAtIndex)) if (longAtIndex > 0) { result.addBitCount(1) } @@ -109,4 +110,17 @@ object UnsafeBitArray { @throws(classOf[java.io.ObjectStreamException]) private def readResolve: AnyRef = unsafeBitArray } + + def getSetBit(i: Long): Long = { + @tailrec + def aux(i: Long, cnt: Long): Long = { + if (i == 0) { + cnt + } else { + aux(i & (i -1), cnt + 1) + } + } + + aux(i, 0) + } } From 360eda2f1bf65af7ce99eff6dfb91cfb8f12f837 Mon Sep 17 00:00:00 2001 From: Sid Date: Tue, 4 Sep 2018 10:36:01 +0800 Subject: [PATCH 7/7] stupid error, forget to use the right function --- .../src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/bloom-filter/src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala b/bloom-filter/src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala index 8af5e1c..e632866 100644 --- a/bloom-filter/src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala +++ b/bloom-filter/src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala @@ -34,10 +34,7 @@ class UnsafeBitArray(val numberOfBits: Long) extends Serializable { val thatLong = unsafe.getLong(that.ptr + (index >>> 6) * 8L) val longAtIndex = combiner(thisLong, thatLong) unsafe.putLong(result.ptr + (index >>> 6) * 8L, longAtIndex) -// result.addBitCount(UnsafeBitArray.getSetBit(longAtIndex)) - if (longAtIndex > 0) { - result.addBitCount(1) - } + result.addBitCount(UnsafeBitArray.getSetBit(longAtIndex)) index += 64 } result