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); } } } }
/* * 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; } } } } } } }
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); }