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; }
private int putIfAbsent(int position, Page page, int rawHash) { int hashPosition = getHashPosition(rawHash, mask); // look for an empty slot or a slot containing this key int groupId = -1; while (groupAddressByHash[hashPosition] != -1) { long address = groupAddressByHash[hashPosition]; if (positionEqualsCurrentRow(decodeSliceIndex(address), decodePosition(address), position, page)) { // found an existing slot for this key groupId = groupIdsByHash[hashPosition]; break; } // increment position and mask to handle wrap around hashPosition = (hashPosition + 1) & mask; } // did we find an existing group? if (groupId < 0) { groupId = addNewGroup(hashPosition, position, page, rawHash); } return groupId; }