private void pushInsert(final Object key, Object value) {
		//System.out.println("PushKeyHash:" + key + "\t" + hash(key.hashCode()) + "\t" + hash(hash(key.hashCode())));
		int code=key.hashCode();
		int hash =hash(code);
		int hash2 =hash2(code);
		int hash3 =hash3(code);
		//assert hash != hash2 && hash2 != hash3;
		hash &=mask;
		hash2 &=mask;
		hash3 &=mask;
		Object workingKey =key;
		//System.out.println("FirstHash:"+hash_+"\t"+hash2_+"\t"+hash3_+"\t"+workingKey);
		while (true) {
			
			for(int i=0;i<size;i++) {
				if (table[hash] == null) {
					table[hash] =workingKey;
					table[hash + 1] =value;
					//System.out.println("Slot1 "+count);
					return;
				}
				if (table[hash2] == null) {
					table[hash2] =workingKey;
					table[hash2 + 1] =value;
					//System.out.println("Slot2 "+count);
					return;
				}
				if (table[hash3] == null) {
					table[hash3] =workingKey;
					table[hash3 + 1] =value;
					//System.out.println("Slot3 "+count);
					return;
				}
				// fail. So push into hash
				switch(random.nextInt(3)){
				case 1:
					hash2=hash3;
					break;
				case 2:
					hash2=hash;
				}
				Object nKey =table[hash2];
				Object nValue =table[hash2 + 1];
				table[hash2] =workingKey;
				table[hash2 + 1] =value;
				workingKey =nKey;
				value =nValue;
				
				// int oldHash =hash;
				code=workingKey.hashCode();
				hash =hash(code);
				hash2 =hash2(code);
				hash3 =hash3(code);
				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();
			code=workingKey.hashCode();
			hash =hash(code);
			hash2 =hash2(code);
			hash3 =hash3(code);
			hash &=mask;
			hash2 &=mask;
			hash3 &=mask;
		}
	}