@Override public boolean contains(int position, Page page, int[] hashChannels) { long rawHash = hashStrategy.hashRow(position, page); int hashPosition = (int) getHashPosition(rawHash, mask); // look for a slot containing this key while (groupAddressByHash[hashPosition] != -1) { if (positionNotDistinctFromCurrentRow(groupAddressByHash[hashPosition], hashPosition, position, page, (byte) rawHash, hashChannels)) { // found an existing slot for this key return true; } // increment position and mask to handle wrap around hashPosition = (hashPosition + 1) & mask; } return false; }
private int putIfAbsent(int position, Page page, long rawHash) { int hashPosition = (int) getHashPosition(rawHash, mask); // look for an empty slot or a slot containing this key int groupId = -1; while (groupAddressByHash[hashPosition] != -1) { if (positionNotDistinctFromCurrentRow(groupAddressByHash[hashPosition], hashPosition, position, page, (byte) rawHash, channels)) { // found an existing slot for this key groupId = groupIdsByHash[hashPosition]; break; } // increment position and mask to handle wrap around hashPosition = (hashPosition + 1) & mask; hashCollisions++; } // did we find an existing group? if (groupId < 0) { groupId = addNewGroup(hashPosition, position, page, rawHash); } return groupId; }