BloomFilter 到 String 并返回
BloomFilter to String and back
我想将 BloomFilter 转换为 String,存储它,然后从 String 中获取它。
如果我只使用字节数组而不转换为字符串 - 一切正常:
BloomFilter<Integer> filter = BloomFilter.create(
Funnels.integerFunnel(),
500,
0.01);
for (int i=0; i<400; i++) {
filter.put(i);
}
System.out.println(filter.approximateElementCount());
System.out.println(filter.expectedFpp());
String s = "";
ByteArrayOutputStream out = new ByteArrayOutputStream();
filter.writeTo(out);
s = out.toString(Charset.defaultCharset());
ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
BloomFilter<Integer> filter1 = BloomFilter.readFrom(in, Funnels.integerFunnel());
System.out.println(filter1.approximateElementCount());
System.out.println(filter1.expectedFpp());
我得到等于输出,但如果我将字节转换为字符串,然后将字符串转换为字节 - 结果是错误的,我得到 filter1.approximateElementCount() = 799 而不是 402。
ByteArrayInputStream in = new ByteArrayInputStream(s.getBytes(Charset.defaultCharset()));
有没有办法将 BloomFilter 转换为字符串并返回?
在 any Charset
中,将字节转换为字符串并返回并不总是可逆的。您必须使用诸如 Base64
(在 Guava 中作为 BaseEncoding.base64()
提供)之类的工具将字节数组转换为字符串,以便您始终可以将其正确转换回来。
我想将 BloomFilter 转换为 String,存储它,然后从 String 中获取它。 如果我只使用字节数组而不转换为字符串 - 一切正常:
BloomFilter<Integer> filter = BloomFilter.create(
Funnels.integerFunnel(),
500,
0.01);
for (int i=0; i<400; i++) {
filter.put(i);
}
System.out.println(filter.approximateElementCount());
System.out.println(filter.expectedFpp());
String s = "";
ByteArrayOutputStream out = new ByteArrayOutputStream();
filter.writeTo(out);
s = out.toString(Charset.defaultCharset());
ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
BloomFilter<Integer> filter1 = BloomFilter.readFrom(in, Funnels.integerFunnel());
System.out.println(filter1.approximateElementCount());
System.out.println(filter1.expectedFpp());
我得到等于输出,但如果我将字节转换为字符串,然后将字符串转换为字节 - 结果是错误的,我得到 filter1.approximateElementCount() = 799 而不是 402。
ByteArrayInputStream in = new ByteArrayInputStream(s.getBytes(Charset.defaultCharset()));
有没有办法将 BloomFilter 转换为字符串并返回?
在 any Charset
中,将字节转换为字符串并返回并不总是可逆的。您必须使用诸如 Base64
(在 Guava 中作为 BaseEncoding.base64()
提供)之类的工具将字节数组转换为字符串,以便您始终可以将其正确转换回来。