#include #include #include #include #include "hashtable.h" #define MAX_LINE 4096 uint64_t word_hash_func(const char* name, size_t length) { uint64_t hash_value = 0; for (size_t i = 0; i < length; i++) { hash_value += name[i]; hash_value = hash_value * name[i]; } return hash_value; } void generate_random_word(char* buffer, size_t length) { for (size_t i = 0; i < length - 1; i++) { buffer[i] = 'a' + (rand() % 26); } buffer[length - 1] = 0; } int main(int argc, char** argv) { if (argc != 3) { printf("usage: %s \n", argv[0]); return EXIT_FAILURE; } char* filename = argv[1]; uint32_t num_guesses = atol(argv[2]); Hashtable* table = hash_table_create(str_hash, str_equal); FILE* fp = fopen(filename, "r"); char* buffer = calloc(sizeof(char), MAX_LINE); uint32_t numwords = 0; uint32_t failed = 0; while (!feof(fp) && fgets(buffer, MAX_LINE, fp) != NULL) { buffer[strcspn(buffer, "\r\n")] = 0; char* newentry = malloc(strlen(buffer) + 1); strcpy(newentry, buffer); bool result = hash_table_insert(table, newentry, newentry); if (result == false) { printf("Failed [%u] storing %s\n", ++failed, newentry); free(newentry); } else numwords++; } fclose(fp); printf("Loaded %d words into the table.\n", numwords); //hash_table_print(table); uint32_t good_guesses = 0; const int shortest_guess = 2; const int longest_guess = 15; void* data = NULL; for (uint32_t i = 0; i < num_guesses; i++) { generate_random_word(buffer, shortest_guess + (rand() % (longest_guess - shortest_guess))); if ((data = hash_table_lookup(table, buffer)) != NULL) { printf("Lookup: %s - Found: %s\n", buffer, (char*) data); good_guesses++; } } printf("%u out of %u guesses were in the table\n", good_guesses, num_guesses); free(buffer); hash_table_destroy(table); }