]>
Commit | Line | Data |
---|---|---|
1d8fe1f7 MR |
1 | #include <stdio.h> |
2 | #include <stdlib.h> | |
3 | #include <string.h> | |
4 | #include <inttypes.h> | |
5 | #include "hashtable.h" | |
6 | ||
7 | #define MAX_LINE 4096 | |
8 | ||
9 | uint64_t word_hash_func(const char* name, size_t length) { | |
10 | uint64_t hash_value = 0; | |
11 | for (size_t i = 0; i < length; i++) { | |
12 | hash_value += name[i]; | |
13 | hash_value = hash_value * name[i]; | |
14 | } | |
15 | return hash_value; | |
16 | } | |
17 | ||
18 | void generate_random_word(char* buffer, size_t length) { | |
19 | for (size_t i = 0; i < length - 1; i++) { | |
20 | buffer[i] = 'a' + (rand() % 26); | |
21 | } | |
22 | buffer[length - 1] = 0; | |
23 | } | |
24 | ||
25 | int main(int argc, char** argv) { | |
26 | if (argc != 3) { | |
27 | printf("usage: %s <wordlist filename> <num guesses>\n", argv[0]); | |
28 | return EXIT_FAILURE; | |
29 | } | |
30 | ||
31 | char* filename = argv[1]; | |
32 | uint32_t num_guesses = atol(argv[2]); | |
33 | ||
34 | Hashtable* table = hash_table_create(str_hash, str_equal); | |
35 | ||
36 | FILE* fp = fopen(filename, "r"); | |
37 | char* buffer = calloc(sizeof(char), MAX_LINE); | |
38 | uint32_t numwords = 0; | |
39 | uint32_t failed = 0; | |
40 | while (!feof(fp) && fgets(buffer, MAX_LINE, fp) != NULL) { | |
41 | buffer[strcspn(buffer, "\r\n")] = 0; | |
42 | char* newentry = malloc(strlen(buffer) + 1); | |
43 | strcpy(newentry, buffer); | |
44 | bool result = hash_table_insert(table, newentry, newentry); | |
45 | if (result == false) { | |
46 | printf("Failed [%u] storing %s\n", ++failed, newentry); | |
47 | free(newentry); | |
48 | } else | |
49 | numwords++; | |
50 | } | |
51 | ||
52 | fclose(fp); | |
53 | printf("Loaded %d words into the table.\n", numwords); | |
54 | ||
55 | //hash_table_print(table); | |
56 | uint32_t good_guesses = 0; | |
57 | const int shortest_guess = 2; | |
58 | const int longest_guess = 15; | |
59 | void* data = NULL; | |
60 | for (uint32_t i = 0; i < num_guesses; i++) { | |
61 | generate_random_word(buffer, shortest_guess + | |
62 | (rand() % (longest_guess - shortest_guess))); | |
63 | if ((data = hash_table_lookup(table, buffer)) != NULL) { | |
64 | printf("Lookup: %s - Found: %s\n", buffer, (char*) data); | |
65 | good_guesses++; | |
66 | } | |
67 | } | |
68 | ||
69 | printf("%u out of %u guesses were in the table\n", good_guesses, num_guesses); | |
70 | ||
71 | free(buffer); | |
72 | hash_table_destroy(table); | |
73 | } |