Author: tedyu Date: Tue Feb 26 01:56:38 2013 New Revision: 1449996 URL: http://svn.apache.org/r1449996 Log: HBASE-7884 ByteBloomFilter's performance can be improved by avoiding multiplication when generating hash (clockfly)
Modified: hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/util/ByteBloomFilter.java Modified: hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/util/ByteBloomFilter.java URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/util/ByteBloomFilter.java?rev=1449996&r1=1449995&r2=1449996&view=diff ============================================================================== --- hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/util/ByteBloomFilter.java (original) +++ hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/util/ByteBloomFilter.java Tue Feb 26 01:56:38 2013 @@ -418,24 +418,27 @@ public class ByteBloomFilter implements int hash1 = hash.hash(buf, offset, length, 0); int hash2 = hash.hash(buf, offset, length, hash1); - int bloomBitSize = bloomSize * 8; - + int bloomBitSize = bloomSize << 3; + if (randomGeneratorForTest == null) { // Production mode. + int compositeHash = hash1; for (int i = 0; i < hashCount; i++) { - long hashLoc = Math.abs((hash1 + i * hash2) % bloomBitSize); - if (!get(hashLoc, bloomArray, bloomOffset)) + int hashLoc = Math.abs(compositeHash % bloomBitSize); + compositeHash += hash2; + if (!get(hashLoc, bloomArray, bloomOffset)) { return false; + } } } else { // Test mode with "fake lookups" to estimate "ideal false positive rate". for (int i = 0; i < hashCount; i++) { - long hashLoc = randomGeneratorForTest.nextInt(bloomBitSize); - if (!get(hashLoc, bloomArray, bloomOffset)) + int hashLoc = randomGeneratorForTest.nextInt(bloomBitSize); + if (!get(hashLoc, bloomArray, bloomOffset)){ return false; + } } } - return true; } @@ -461,9 +464,9 @@ public class ByteBloomFilter implements * @param pos index of bit * @return true if bit at specified index is 1, false if 0. */ - static boolean get(long pos, byte[] bloomArray, int bloomOffset) { - int bytePos = (int)(pos / 8); - int bitPos = (int)(pos % 8); + static boolean get(int pos, byte[] bloomArray, int bloomOffset) { + int bytePos = pos >> 3; //pos / 8 + int bitPos = pos & 0x7; //pos % 8 byte curByte = bloomArray[bloomOffset + bytePos]; curByte &= bitvals[bitPos]; return (curByte != 0);