public boolean findInBucket(long hash, byte[] k, SearchResult out){
			final int startSubIdx = subIdxForHash(hash);
			for(int offset = 0; offset < recordsPerBucket; offset++){
				final int subIdx = (startSubIdx + offset) % recordsPerBucket;
				final long subPos = subPosForSubIdx(pos, subIdx);
				
				final RecordPtr recPtr = new RecordPtr(mapper, subPos);
				
				if(recPtr.maybeMatches(hash, k)){
					//Check for "real" match
					final byte[] prospectiveV = getValIfMatch(recPtr, k);
					if(prospectiveV != null){
						out.val = prospectiveV;
						out.foundBucket = this;
						out.foundSubIdx = subIdx;
						return true;
					}
					else continue;
				} else if(recPtr.isFree()){
					if(out.freeBucket == null){
						out.freeBucket = this;
						out.freeSubIdx = subIdx;
					}
					break;
				} else if (recPtr.isDeleted()){
					if(out.freeBucket == null){
						out.freeBucket = this;
						out.freeSubIdx = subIdx;
					}
					continue;
				} else {
					//Mismatched non-writable key.  Keep traversing bucket
					continue;
				}
			}
			return false;
		}