private void pushInsert(final int key, V value) {
		// System.out.println("PushKeyHash:" + key + "\t" + hash(key.hashCode()) + "\t" +
		// hash(hash(key.hashCode())));

		int hash =hash(key);
		int hash2 =hash2(key);
		int hash3 =hash3(key);
		// assert hash != hash2 && hash2 != hash3;
		hash &=mask;
		hash2 &=mask;
		hash3 &=mask;
		int workingKey =key;
		// System.out.println("FirstHash:"+hash_+"\t"+hash2_+"\t"+hash3_+"\t"+workingKey);
		while (true) {

			for (int i =0; i < size; i++) {
				if (entrys[hash] == null) {
					keys[hash] =workingKey;
					entrys[hash] =value;
					// System.out.println("Slot1 "+count);
					return;
				}
				if (entrys[hash2] == null) {
					keys[hash2] =workingKey;
					entrys[hash2] =value;
					// System.out.println("Slot1 "+count);
					return;
				}
				if (entrys[hash3] == null) {
					keys[hash3] =workingKey;
					entrys[hash3] =value;
					// System.out.println("Slot1 "+count);
					return;
				}
				// fail. So push into hash
				switch (random.nextInt(3)) {
				case 1:
					hash2 =hash3;
					break;
				case 2:
					hash2 =hash;
				}
				int nKey =keys[hash2];
				V nValue =entrys[hash2];
				keys[hash2] =workingKey;
				entrys[hash2] =value;
				workingKey =nKey;
				value =nValue;

				// int oldHash =hash;

				hash =hash(workingKey);
				hash2 =hash2(workingKey);
				hash3 =hash3(workingKey);
				hash &=mask;
				hash2 &=mask;
				hash3 &=mask;
				// System.out.println("NextHash:"+hash_+"\t"+hash2_+"\t"+hash3_+"\t"+workingKey);
				// assert (key != workingKey && !key.equals(workingKey)) || (key == workingKey) :
				// key + "\t" + workingKey + "\t" + key == workingKey;
			}
			;
			// System.out.println(hash_ + "\t" + hash2_ + "\t" + hash3_ + "\t:" + table.length +
			// "\tcount:" + count);
			rehash();
			hash =hash(workingKey);
			hash2 =hash2(workingKey);
			hash3 =hash3(workingKey);
			hash &=mask;
			hash2 &=mask;
			hash3 &=mask;
		}
	}