Skip to content

Instantly share code, notes, and snippets.

@gresrun
Forked from gmuller/redisBitSetTests.java
Created May 23, 2012 03:41
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save gresrun/2773136 to your computer and use it in GitHub Desktop.
Save gresrun/2773136 to your computer and use it in GitHub Desktop.
An attempt to understand byte and bit ordering in redis bitsets
import java.util.Arrays;
import java.util.BitSet;
import redis.clients.jedis.Jedis;
public class SieveOfEratosthenes {
/**
* @param args
*/
public static void main(final String[] args) {
// setup values
final Jedis redis = new Jedis("localhost");
final String sieveSetBit = "sieveSetBit";
final String sieveSetKey = "sieveSetKey";
final int length = 20;
final BitSet sieve = new BitSet(length);
sieve.flip(2, length);
// create bitset of all values
for (int i = 0; i < length; i++) {
if (sieve.get(i)) {
for (int j = i * 2; j < length; j += i) {
sieve.set(j, false);
}
}
}
// Write 2 bitsets to redis
// 1. setbit through redis
for (int i = 0; i < sieve.length(); i++) {
if (sieve.get(i)) {
redis.setbit(sieveSetBit, i, true);
}
}
// 2. Set entire bitset
redis.set(sieveSetKey.getBytes(), sieve.toByteArray());
// Compare bitsets from Redis when retrieved via getKey
final String sieveBitString = redis.get(sieveSetBit);
final String sieveKeyString = redis.get(sieveSetKey);
final byte[] sieveBitBytes = redis.get(sieveSetBit.getBytes());
final byte[] sieveKeyBytes = redis.get(sieveSetKey.getBytes());
final BitSet setBitSieve = BitSet.valueOf(sieveBitString.getBytes());
final BitSet setKeySieve = BitSet.valueOf(sieveKeyString.getBytes());
final BitSet reverseSetBit = fromByteArray(sieveBitString.getBytes());
final BitSet reverseSetKey = fromByteArray(sieveKeyString.getBytes());
System.out.println(Arrays.toString(sieve.toByteArray()));
System.out.println(sieve + " <== Original Sieve");
System.out.println();
System.out.println(Arrays.toString(sieveBitString.getBytes()));
System.out.println(setBitSieve + " <== setbit/get (String) -> BitSet.valueOf()");
System.out.println(reverseSetBit + " <== setbit/get (String) -> fromByteArray()");
System.out.println();
System.out.println(Arrays.toString(sieveKeyString.getBytes()));
System.out.println(setKeySieve + " <== set/get (String) -> BitSet.valueOf()");
System.out.println(reverseSetKey + " <== set/get (String) -> fromByteArray()");
System.out.println();
System.out.println(Arrays.toString(sieveKeyBytes));
System.out.println(BitSet.valueOf(sieveKeyBytes) + " <== get/set (byte[] versions) -> BitSet.valueOf()");
System.out.println();
System.out.println(Arrays.toString(sieveBitBytes));
System.out.println(BitSet.valueOf(sieveBitBytes) + " <== setbit/get (byte[] versions) -> BitSet.valueOf()");
System.out.println(fromByteArrayReverse(sieveBitBytes) + " <== setbit/get (byte[] versions) -> fromByteArrayReverse()");
}
public static BitSet fromByteArrayReverse(final byte[] bytes) {
final BitSet bits = new BitSet();
for (int i = 0; i < bytes.length * 8; i++) {
if ((bytes[i / 8] & (1 << (7 - (i % 8)))) != 0) {
bits.set(i);
}
}
return bits;
}
public static BitSet fromByteArray(final byte[] bytes) {
final BitSet bits = new BitSet();
for (int i = 0; i < bytes.length * 8; i++) {
if ((bytes[bytes.length - i / 8 - 1] & (1 << (i % 8))) > 0) {
bits.set(i);
}
}
return bits;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment