private boolean pushInsert(T e) {
		int code=e.hashCode();
		int hash =hash(code);
		int hash2 = hash2(code);
		int hash3 =hash3(code);
		hash =hash & mask;
		hash2 =hash2 & mask;
		hash3 =hash3 & mask;
		while (true) {
			for (int i =0; i < size; i++) {
				if (table[hash] == null) {
					table[hash] =e;
					// System.out.println("Iter1:"+i);
					return true;
				}
				if (table[hash2] == null) {
					table[hash2] =e;
					// System.out.println("Iter2:"+i);
					return true;
				}
				if (table[hash3] == null) {
					table[hash3] =e;
					// System.out.println("Iter3:"+i+"\t"+hash+"\t"+hash2+"\t"+hash3);
					return true;
				}
				// didn't add --evict hash element
				switch(random.nextInt(3)){
				case 1:
					hash=hash2;
					break;
				case 2:
					hash=hash3;
				}
				T pushed =table[hash];
				table[hash] =e;
				e =pushed;
				int oldHash =hash;
				// now get all the hashes for the new element
				code=e.hashCode();
				hash =hash(code);
				hash2 = hash2(code);
				hash3 =hash3(code);
				hash =hash & mask;
				hash2 =hash2 & mask;
				hash3 =hash3 & mask;
				// check the patalogical case of old=new.
				if (hash == oldHash) {
					hash =hash3;
					hash3 =oldHash;// swap
				}

			}
			//System.out.println("PushRehash");
			rehash();
			// the last element we still have now has invalid hash codes
			// this should be very rare and so expensive that this hardly matters
			code=e.hashCode();
			hash =hash(code);
			hash2 = hash2(code);
			hash3 =hash3(code);
			hash =hash & mask;
			hash2 =hash2 & mask;
			hash3 =hash3 & mask;
		}
		// return false;

	}