public void delete(Key key) {
	    if(key == null) {
	      throw new NullPointerException("Key may not be null");
	    }
	    if(!membershipTest(key)) {
	      throw new IllegalArgumentException("Key is not a member");
	    }

	    int[] h = hash.hash(key);
	    hash.clear();

	    for(int i = 0; i < nbHash; i++) {
	      // find the bucket
	      int wordNum = h[i] >> 4;          // div 16
	      int bucketShift = (h[i] & 0x0f) << 2;  // (mod 16) * 4
	      
	      long bucketMask = 15L << bucketShift;
	      
	      boolean hasUpdatedSuccess = false;   // 是否更新成功
	      int retriedTimes = 0;   // 已重试次数
	      while(!hasUpdatedSuccess && retriedTimes < MAX_UPDATE_RETRY_TIMES) {
	    	  long oldVal = buckets[wordNum].get();
		      long bucketValue = (oldVal & bucketMask) >>> bucketShift;
		      // only decrement if the count in the bucket is between 0 and BUCKET_MAX_VALUE
		      if(bucketValue >= 1 && bucketValue < BUCKET_MAX_VALUE) {
		        // decrement by 1
		        hasUpdatedSuccess = buckets[wordNum]
		        						.compareAndSet(oldVal, 
		        									   (oldVal & ~bucketMask) | ((bucketValue - 1) << bucketShift));
		      }
		      
		      retriedTimes++;
	      }   // while ends
	      
	      // do log
	      if(!hasUpdatedSuccess && retriedTimes == MAX_UPDATE_RETRY_TIMES) {
	    	  LOG.error("collision occurn: delete");
	      }
	    }
	  }