-
-
Save gmuller/2933940 to your computer and use it in GitHub Desktop.
Revisions
-
gmuller revised this gist
Jul 4, 2012 . 1 changed file with 67 additions and 23 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -6,50 +6,94 @@ public class SieveOfEratosthenes { private static String sieveSetKeyCorrected = "correct_sieve"; private static String sieveSetKeyDefaultJava = "wrong_sieve"; private static String spoolSieve = "sieve_set_bits"; /** * @param args */ public static void main(final String[] args) { // Initialize my redis client values final Jedis redis = new Jedis("localhost"); System.out.println("Alright, let's create a sieve of primes, Eratosthenes style!"); final int length = 20; final BitSet primes = new BitSet(length); primes.flip(2, length); for (int i = 0; i < length; i++) { if (primes.get(i)) { for (int j = i * 2; j < length; j += i) { primes.set(j, false); } } } System.out.println("Let's set the bits in redis the ol' fashioned way"); System.out.println("One at a time using redis.setbit"); for (int i = 0; i < primes.length(); i++) { if (primes.get(i)) { redis.setbit(spoolSieve, i, true); } } System.out.println("And then read the bitset out, just like the example"); final BitSet spoolWaySieve = BitSet.valueOf(redis.get(spoolSieve.getBytes())); System.out.println("And compare the values"); System.out.println("Original Sieve: " + primes); System.out.println("Read via BitSet.valueOf(): " + spoolWaySieve); System.out.println("\nWhat The? Thats not right at all!"); System.out.println("Let's try reversing the bits in the bytes"); final BitSet correctedBits = fromByteArrayReverse(redis.get(spoolSieve.getBytes())); System.out.println("And compare the values"); System.out.println("Original Sieve: " + primes); System.out.println("Read via helper method: " + correctedBits); System.out.println("\nThat's better."); System.out.println("Now what happens if I try to write the entire BitSet into Redis"); System.out.println("Using the BitSet.toByteArray() method built-in"); System.out.println("Then pull the values back out"); redis.set(sieveSetKeyDefaultJava.getBytes(), primes.toByteArray()); final BitSet defaultJava = BitSet.valueOf(redis.get(sieveSetKeyDefaultJava.getBytes())); System.out.println("Original Sieve: " + primes); System.out .println("Stored via BitSet.toByteArray() and retrieved via BitSet.valueOf: " + defaultJava); System.out.println("\nThat appears to work...but there is a catch"); System.out.println("If you try to read the values out using getBit"); System.out .println("They are mangled because we effectively used Java's byte ordering"); System.out.println("Look. redis.getbit(4) -> " + redis.getbit(sieveSetKeyDefaultJava, 4)); System.out.println("Last I checked, 4 is not prime"); System.out.println("\nThis also means calls to getbit from another language"); System.out.println("and especially redis-cli, will be incorrect"); System.out .println("\nSo, let's write another helper method to reverse the bits on the way in"); System.out.println("And write the sieve of primes"); System.out.println("And check to make sure the native calls to getBit still work"); System.out.println("And use our helper method to get the BitSet in one call"); redis.set(sieveSetKeyCorrected.getBytes(), toByteArrayReverse(primes)); final BitSet correctedSieve = fromByteArrayReverse(redis.get(sieveSetKeyCorrected.getBytes())); System.out.println("Original Sieve: " + primes); System.out.println("Stored via helper method and retrieved via helper method: " + correctedSieve); System.out .println("Look. redis.getbit(4) -> " + redis.getbit(sieveSetKeyCorrected, 4)); System.out .println("\nThere we go. Use a help method to reverse the bits on the way in or out"); System.out.println("To make sure your native calls still work"); } public static BitSet fromByteArrayReverse(final byte[] bytes) { -
gmuller revised this gist
Jun 16, 2012 . 1 changed file with 0 additions and 105 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,105 +0,0 @@ -
gmuller revised this gist
Jun 16, 2012 . 1 changed file with 75 additions and 0 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,75 @@ import java.util.BitSet; import redis.clients.jedis.Jedis; public class SieveOfEratosthenes { private static String sieveSetKeyCorrected = "correct_sieve"; private static String sieveSetKeyDefaultJava = "wrong_sieve"; private static String sieveSetBitsKey = "sieve_set_bits"; /** * @param args */ public static void main(final String[] args) { // setup redis values final Jedis redis = new Jedis("localhost"); // setup our prime bitset 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 3 bitsets to redis // 1. setbit through redis for (int i = 0; i < sieve.length(); i++) { if (sieve.get(i)) { redis.setbit(sieveSetBitsKey, i, true); } } // 2. Set entire bitset with default java methods redis.set(sieveSetKeyDefaultJava.getBytes(), sieve.toByteArray()); // 3. Set entire bitset with correct method redis.set(sieveSetKeyCorrected.getBytes(), toByteArrayReverse(sieve)); // Compare bitsets from Redis when retrieved via getKey final byte[] sieveSetBitsBytes = redis.get(sieveSetBitsKey.getBytes()); final byte[] sieveSetKeyDefaultJavaBytes = redis.get(sieveSetKeyDefaultJava.getBytes()); final byte[] sieveSetKeyCorrectedBytes = redis.get(sieveSetKeyCorrected.getBytes()); } 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 byte[] toByteArrayReverse(final BitSet bits) { final byte[] bytes = new byte[bits.length() / 8 + 1]; for (int i = 0; i < bits.length(); i++) { if (bits.get(i)) { final int value = bytes[i / 8] | (1 << (7 - (i % 8))); bytes[i / 8] = (byte) value; } } return bytes; } } -
gmuller revised this gist
Jun 15, 2012 . 1 changed file with 91 additions and 75 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -5,85 +5,101 @@ 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()"); System.out.println(); System.out.println(Arrays.toString(sieveBitBytes)); System.out.println(BitSet.valueOf(sieveBitBytes) + " <== setbit/get (byte[] versions) -> BitSet.valueOf()"); System.out.println(toByteArrayReverse(sieve) + " <== reverse To Array before storages -> toByteArrayReverse()"); } 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; } public static byte[] toByteArrayReverse(BitSet bits) { final byte[] bytes = new byte[bits.length() / 8 + 1]; for (int i = 0; i < bits.length(); i++) { if (bits.get(i)) { int value = bytes[i/8] | (1 <<( 7 -(i%8))); bytes[i/8] = (byte) value; } } return bytes; } } -
gresrun revised this gist
May 23, 2012 . 1 changed file with 32 additions and 6 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,3 +1,4 @@ import java.util.Arrays; import java.util.BitSet; import redis.clients.jedis.Jedis; @@ -39,18 +40,43 @@ public static void main(final String[] args) { // 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++) { @@ -60,4 +86,4 @@ public static BitSet fromByteArray(final byte[] bytes) { } return bits; } } -
gmuller created this gist
May 20, 2012 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,63 @@ 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 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(setBitSieve); System.out.println(setKeySieve); System.out.println(reverseSetBit); System.out.println(reverseSetKey); } 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; } }