static void add_element(void) { char keybuf[100]; struct ht_element *x = malloc(sizeof(struct ht_element)); sprintf(keybuf,"key%08d", glob_highwater++); x->key = strdup(keybuf); x->val = strdup("interesting data"); ast_hashtab_insert_immediate(glob_hashtab, x); els_added++; }
/*! /brief Grow the hash data as specified */ static void *hash_test_grow(void *d) { struct hash_test *data = d; int i; for (i = 0; i < data->max_grow; ++i) { char *obj; if (is_timed_out(data)) { return "Growth timed out"; } obj = ht_new(i); if (obj == NULL) { return "Allocation failed"; } ast_hashtab_insert_immediate(data->to_be_thrashed, obj); ast_atomic_fetchadd_int(&data->grow_count, 1); } return NULL; }
int print_result(int *currset, int len, char **vals) { char solutionstring[1000]; /* print out the set */ /* int i; for(i=0;i<len;i++) { printf("%s", vals[currset[i]]); } printf("\n"); */ /* test to see if each of the 6 lines of numbers adds to 26 */ if( (char)vals[currset[0]][0] + (char)vals[currset[2]][0] + (char)vals[currset[5]][0] + (char)vals[currset[7]][0] == 26 && (char)vals[currset[0]][0] + (char)vals[currset[3]][0] + (char)vals[currset[6]][0] + (char)vals[currset[10]][0] == 26 && (char)vals[currset[1]][0] + (char)vals[currset[2]][0] + (char)vals[currset[3]][0] + (char)vals[currset[4]][0] == 26 && (char)vals[currset[1]][0] + (char)vals[currset[5]][0] + (char)vals[currset[8]][0] + (char)vals[currset[11]][0] == 26 && (char)vals[currset[7]][0] + (char)vals[currset[8]][0] + (char)vals[currset[9]][0] + (char)vals[currset[10]][0] == 26 && (char)vals[currset[4]][0] + (char)vals[currset[6]][0] + (char)vals[currset[9]][0] + (char)vals[currset[11]][0] == 26) { char *lookup_result; /* yay! we found a solution! Check in the hashtab for it-- forming a string of the list of numbers should make for fairly quick way of checking */ sprintf(solutionstring,"%d-%d-%d-%d-%d-%d-%d-%d-%d-%d-%d-%d", (char)vals[currset[0]][0], (char)vals[currset[1]][0], (char)vals[currset[2]][0], (char)vals[currset[3]][0], (char)vals[currset[4]][0], (char)vals[currset[5]][0], (char)vals[currset[6]][0], (char)vals[currset[7]][0], (char)vals[currset[8]][0], (char)vals[currset[9]][0], (char)vals[currset[10]][0], (char)vals[currset[11]][0]); lookup_result = ast_hashtab_lookup(solutions, solutionstring); if (!lookup_result) { printf("\n Solution: 1=%d; 2=%d; 3=%d; 4=%d; 5=%d; 6=%d, 7=%d; 8=%d; 9=%d; 10=%d; 11=%d; 12=%d\n", (char)vals[currset[0]][0], (char)vals[currset[1]][0], (char)vals[currset[2]][0], (char)vals[currset[3]][0], (char)vals[currset[4]][0], (char)vals[currset[5]][0], (char)vals[currset[6]][0], (char)vals[currset[7]][0], (char)vals[currset[8]][0], (char)vals[currset[9]][0], (char)vals[currset[10]][0], (char)vals[currset[11]][0]); solution_count++; /* really, we don't need to insert the unrotated solution; it will never come up again. But, oh, well.... */ ast_hashtab_insert_immediate(solutions, strdup(solutionstring)); /* How do I come up the index numbers? just take the drawing, rotate it to the right one step, and now read off the position numbers on the rotated set... */ /* rotate 1/6 to the right */ sprintf(solutionstring,"%d-%d-%d-%d-%d-%d-%d-%d-%d-%d-%d-%d", (char)vals[currset[1]][0], (char)vals[currset[7]][0], (char)vals[currset[5]][0], (char)vals[currset[2]][0], (char)vals[currset[0]][0], (char)vals[currset[8]][0], (char)vals[currset[3]][0], (char)vals[currset[11]][0], (char)vals[currset[9]][0], (char)vals[currset[6]][0], (char)vals[currset[4]][0], (char)vals[currset[10]][0]); ast_hashtab_insert_immediate(solutions, strdup(solutionstring)); /* rotate 2/6 to the right */ sprintf(solutionstring,"%d-%d-%d-%d-%d-%d-%d-%d-%d-%d-%d-%d", (char)vals[currset[7]][0], (char)vals[currset[11]][0], (char)vals[currset[8]][0], (char)vals[currset[5]][0], (char)vals[currset[1]][0], (char)vals[currset[9]][0], (char)vals[currset[2]][0], (char)vals[currset[10]][0], (char)vals[currset[6]][0], (char)vals[currset[3]][0], (char)vals[currset[0]][0], (char)vals[currset[4]][0]); ast_hashtab_insert_immediate(solutions, strdup(solutionstring)); /* rotate 3/6 to the right */ sprintf(solutionstring,"%d-%d-%d-%d-%d-%d-%d-%d-%d-%d-%d-%d", (char)vals[currset[11]][0], (char)vals[currset[10]][0], (char)vals[currset[9]][0], (char)vals[currset[8]][0], (char)vals[currset[7]][0], (char)vals[currset[6]][0], (char)vals[currset[5]][0], (char)vals[currset[4]][0], (char)vals[currset[3]][0], (char)vals[currset[2]][0], (char)vals[currset[1]][0], (char)vals[currset[0]][0]); ast_hashtab_insert_immediate(solutions, strdup(solutionstring)); /* rotate 4/6 to the right */ sprintf(solutionstring,"%d-%d-%d-%d-%d-%d-%d-%d-%d-%d-%d-%d", (char)vals[currset[10]][0], (char)vals[currset[4]][0], (char)vals[currset[6]][0], (char)vals[currset[9]][0], (char)vals[currset[11]][0], (char)vals[currset[3]][0], (char)vals[currset[8]][0], (char)vals[currset[0]][0], (char)vals[currset[2]][0], (char)vals[currset[5]][0], (char)vals[currset[7]][0], (char)vals[currset[1]][0]); ast_hashtab_insert_immediate(solutions, strdup(solutionstring)); /* rotate 5/6 to the right */ sprintf(solutionstring,"%d-%d-%d-%d-%d-%d-%d-%d-%d-%d-%d-%d", (char)vals[currset[4]][0], (char)vals[currset[0]][0], (char)vals[currset[3]][0], (char)vals[currset[6]][0], (char)vals[currset[10]][0], (char)vals[currset[2]][0], (char)vals[currset[9]][0], (char)vals[currset[1]][0], (char)vals[currset[5]][0], (char)vals[currset[8]][0], (char)vals[currset[11]][0], (char)vals[currset[7]][0]); ast_hashtab_insert_immediate(solutions, strdup(solutionstring)); } else non_unique_solutions_count++; } permutation_count++; if( ((permutation_count+1) % 1000000) == 0 ) { printf("."); fflush(stdout); /* show progress to keep the impatient calm -- you should get around 470 of these, each standing for a million generated permutations */ } }