Skip to content

Commit

Permalink
maybeContains
Browse files Browse the repository at this point in the history
  • Loading branch information
bingoohuang committed May 29, 2018
1 parent fbf706e commit dc33a8f
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 39 deletions.
15 changes: 5 additions & 10 deletions src/main/java/com/github/bingoohuang/voucherno/BloomFilter.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
*/
public class BloomFilter {
private final RedisBitSet bitSet;

private final int bitSetSize;
private final int k; // number of hash functions

Expand Down Expand Up @@ -63,9 +62,7 @@ public boolean add(String element) {
* @return added without conflicts or not.
*/
public boolean add(byte[] bytes) {
int[] hashes = createHashes(bytes);

return bitSet.add(hashes);
return bitSet.add(createHashes(bytes));
}

/**
Expand All @@ -76,8 +73,8 @@ public boolean add(byte[] bytes) {
* @param element element to check.
* @return true if the element could have been inserted into the Bloom filter.
*/
public boolean contains(String element) {
return contains(element.getBytes(MessageDigestUtils.UTF8));
public boolean maybeContains(String element) {
return maybeContains(element.getBytes(MessageDigestUtils.UTF8));
}

/**
Expand All @@ -88,10 +85,8 @@ public boolean contains(String element) {
* @param bytes array of bytes to check.
* @return true if the array could have been inserted into the Bloom filter.
*/
public boolean contains(byte[] bytes) {
int[] hashes = createHashes(bytes);

return bitSet.contains(hashes);
public boolean maybeContains(byte[] bytes) {
return bitSet.maybeContains(createHashes(bytes));
}

private int[] createHashes(byte[] bytes) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,14 @@ public RedisBitSet(BinaryJedis jedis, String name) {
public boolean add(int[] hashes) {
val multi = jedis.multi();
Arrays.stream(hashes).forEach(x -> multi.setbit(name, x, Protocol.BYTES_TRUE));
// 只要有一个比特位之前没被设置过,说明曾经不存在,返回为true
return multi.exec().stream().filter(x -> x == Boolean.FALSE).count() > 0;
}

public boolean contains(int[] hashes) {
public boolean maybeContains(int[] hashes) {
val multi = jedis.multi();
Arrays.stream(hashes).forEach(x -> multi.getbit(name, x));
// 所有比特位,都被设置了,那就是可能被包含了。
return multi.exec().stream().filter(x -> x == Boolean.FALSE).count() == 0;
}
}
17 changes: 17 additions & 0 deletions src/main/java/com/github/bingoohuang/voucherno/Strs.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.github.bingoohuang.voucherno;

import java.util.stream.IntStream;

public class Strs {
public static StringBuilder fixedLength(StringBuilder s, int len) {
int diff = len - s.length();
if (diff < 0) return s.delete(len, s.length());
if (diff > 0) return padZero(s, diff);
return s;
}

public static StringBuilder padZero(StringBuilder s, int diff) {
IntStream.range(0, diff).forEach(x -> s.append('0'));
return s;
}
}
28 changes: 5 additions & 23 deletions src/main/java/com/github/bingoohuang/voucherno/VoucherNo.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,34 +31,16 @@ public String next() {
*/
public String next(int maxTries) {
for (int i = 1; i <= maxTries; ++i) {
val s = new StringBuilder(32);
s.append(Math.abs(r.nextLong()));
String n = fixedLength(s);

if (filter.add(n)) return n;
val sb = new StringBuilder(32).append(Math.abs(r.nextLong()));
val s = Strs.fixedLength(sb, len).toString();
if (filter.add(s)) return s;
}

throw new RuntimeException("try out times");
}

String fixedLength(StringBuilder s) {
int diff = len - s.length();
if (diff < 0) {
s.delete(len, s.length());
} else if (diff > 0) {
padZero(s, diff);
}

return s.toString();
}

void padZero(StringBuilder s, int diff) {
for (int i = 0; i < diff; ++i) {
s.append('0');
}
}

public boolean contains(String no) {
return filter.contains(no);
public boolean maybeContains(String no) {
return filter.maybeContains(no);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,18 +31,16 @@ public void test() {
val no = voucherNo.next();
log.info("voucher NO:{}", no);
assertThat(no).containsMatch("\\d{12}");
assertThat(voucherNo.contains(no)).isTrue();
assertThat(voucherNo.maybeContains(no)).isTrue();
}
}

@Test
public void padZero() {
StringBuilder sb = new StringBuilder("1");
voucherNo.padZero(sb, 10);
assertThat(sb.toString()).isEqualTo("10000000000");
assertThat(Strs.padZero(sb, 10).toString()).isEqualTo("10000000000");

StringBuilder s = new StringBuilder("1");
String n = voucherNo.fixedLength(s);
assertThat(n).isEqualTo("100000000000");
assertThat(Strs.fixedLength(s, 12).toString()).isEqualTo("100000000000");
}
}

0 comments on commit dc33a8f

Please sign in to comment.