@SuppressWarnings("unused")
	public void put(long key, long value) {
		// Get reference to 'values'
		int bucketNumber = getBucketNumber(key);

		if( bucketNumber == 0 ) { // Not found?
			bucketNumber = bucketsUsed++;
			hash.put(key, bucketNumber);

			// No more buckets available? => Resize
			if( bucketsUsed > buckets.length ) {
				int newSize = (int) (buckets.length * BUCKET_EXPANSION_FACTOR);
				long newBuckets[][] = new long[newSize][];
				int newBucketFa[] = new int[newSize];
				System.arraycopy(buckets, 0, newBuckets, 0, buckets.length);
				System.arraycopy(bucketFirstAvailable, 0, newBucketFa, 0, buckets.length);
				buckets = newBuckets;
				bucketFirstAvailable = newBucketFa;
			}
		}

		// Get references array
		long bucket[] = buckets[bucketNumber];
		if( bucket == null ) {
			bucket = buckets[bucketNumber] = new long[INITIAL_BUCKET_SIZE];
			if( EMPTY_VALUE != 0 ) { // Only if this ever changes, we need to initialize
				for( int i = 0; i < bucket.length; i++ )
					bucket[i] = EMPTY_VALUE;
			}
		}

		// Find first available position in 'bucket'
		int bucketIndex = bucketFirstAvailable[bucketNumber];
		bucketFirstAvailable[bucketNumber]++;

		// Nothing available? => resize
		if( bucketIndex >= bucket.length ) {
			int newSize = bucket.length * BUCKET_CAPACITY_EXPANSION_FACTOR;
			long newRefs[] = new long[newSize];
			System.arraycopy(bucket, 0, newRefs, 0, bucket.length);
			bucket = buckets[bucketNumber] = newRefs;
		}

		// Add new value to bucket
		bucket[bucketIndex] = value;
	}