Skip to content

Commit f8dd4ca

Browse files
Merge pull request #37 from SidWeng/master
get the filter element size
2 parents 0a1265e + a2a8b41 commit f8dd4ca

File tree

2 files changed

+10
-1
lines changed

2 files changed

+10
-1
lines changed

bloom-filter/src/main/scala/bloomfilter/mutable/BloomFilter.scala

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package bloomfilter.mutable
22

33
import java.io.{DataInputStream, DataOutputStream, InputStream, OutputStream}
4+
import scala.math._
45

56
import bloomfilter.CanGenerateHashFrom
67

@@ -62,6 +63,12 @@ class BloomFilter[T] private (val numberOfBits: Long, val numberOfHashes: Int, p
6263
bits.writeTo(out)
6364
}
6465

66+
def approximateElementCount(): Long = {
67+
val bitCount = bits.getBitCount
68+
69+
val fractionOfBitsSet = (bitCount / numberOfBits).toDouble
70+
return round(-log1p(-(fractionOfBitsSet)) * numberOfBits / numberOfHashes)
71+
}
6572

6673
def dispose(): Unit = bits.dispose()
6774

bloom-filter/src/main/scala/bloomfilter/mutable/UnsafeBitArray.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class UnsafeBitArray(val numberOfBits: Long) extends Serializable {
1010
@transient
1111
private val ptr = unsafe.allocateMemory(8L * indices)
1212
unsafe.setMemory(ptr, 8L * indices, 0.toByte)
13+
private var bitCount = 0L
1314

1415
def get(index: Long): Boolean = {
1516
(unsafe.getLong(ptr + (index >>> 6) * 8L) & (1L << index)) != 0
@@ -20,6 +21,7 @@ class UnsafeBitArray(val numberOfBits: Long) extends Serializable {
2021
val long = unsafe.getLong(offset)
2122
if ((long & (1L << index)) == 0) {
2223
unsafe.putLong(offset, long | (1L << index))
24+
bitCount += 1
2325
}
2426
}
2527

@@ -49,7 +51,7 @@ class UnsafeBitArray(val numberOfBits: Long) extends Serializable {
4951
}
5052

5153
def getBitCount: Long = {
52-
throw new NotImplementedError("Not implemented yet")
54+
bitCount
5355
}
5456

5557
def writeTo(out: OutputStream): Unit = {

0 commit comments

Comments
 (0)