Пример #1
0
static void
search_by_ullmann(struct State * state, struct Query * query, struct Target * target){
  int k;
  // Idea for optimization
  //show(state->mat, query->len, target->n_bits);
  if(state->depth == state->height - 1){
    //printf("FOUND!\n");
    state_push_result(state);
    //show(state->mat, query->len, target->n_bits);
  }else{
    for(k = 0 ; k < target->n_bits ; k++){
      if(has_bit(state->mat,
		 state->depth + 1,
		 k,
		 target->n_bytes)){
	state_push(state);
	state_clear_bits(state->mat, state->depth, k, target->n_bytes, query->len);
	//show(state->mat, query->len, target->n_bits);
	refine(state, query, target);
	//show(state->mat, query->len, target->n_bits);
	if(state_is_valid(state) == TRUE){
	  //show(state->mat, query->len, target->n_bits);
	  search_by_ullmann(state, query, target);
	}
	state_pop(state);
      }
    }
  }
}
Пример #2
0
/*
 * Hot spot
 */
inline static void
refine(struct State * state, struct Query * query, struct Target * target){
  int i, j, k, l, m, bit_removed;
  bit_removed = 1;
  while(bit_removed){
    bit_removed = 0;// false
    for(i = 0 ; i < query->len ; i++){
      for(j = 0 ; j < target->n_bits ; j++){
	if(has_bit(state->mat, i, j, target->n_bytes)){
	  for(k = 0 ; k < query->num[i] ; k++){
	    m = 0;
	    for(l = 0 ; l < target->n_bytes ; l++){
	      if((state->mat[query->ptr[i][k] * target->n_bytes + l] &
		  target->mat[j * target->n_bytes + l]) != 0){
		m++;
	      }
	    }
	    if(m == 0){
	      BITOFF(state->mat, i, j, target->n_bytes);
	      bit_removed = 1;
	    }
	  }
	}
      }
    }
  }
}
Пример #3
0
		bool find(sha1_hash const& k) const
		{
			return has_bit(k[0], bits, N)
				&& has_bit(k[1], bits, N)
				&& has_bit(k[2], bits, N);
		}