#include #include #include #include #include #include #define BUFSIZE 20 #define BUFENTRIES 480 #define BUCKETS 512 long long input[BUFENTRIES][2]; int hashtable[BUCKETS]; static void print_output(void) { int k; for (k = 0; k < BUCKETS; ++k) printf("%d \n", hashtable[k]); } #define __WORD_BIT 32 #define GOLDEN_RATIO_PRIME 2654404609U #define SHIFTS (__WORD_BIT - 9) static int goldenhash(long long key[]) { unsigned long long n = key[0] + key[1]; return (((n * GOLDEN_RATIO_PRIME) >> SHIFTS) % BUCKETS); } static void hash_me(void) { int bucket, k; for (k = 0; k < BUFENTRIES; ++k) { bucket = goldenhash(input[k]); hashtable[bucket]++; } print_output(); } static int parse_file(const char *file) { char buf[BUFSIZE]; char buf2[BUFSIZE]; ssize_t ret; int fd, i, k; fd = open(file, O_RDONLY); if (fd < 0) { printf("Error in open() \n"); return (-1); } for (k = 0; k < BUFENTRIES; ++k) { i = 0; for (;;) { ret = read(fd, buf + i, 1); if (ret != 1 || *(buf + i) == ' ') { buf[i] = '\0'; break; } i++; } sscanf(buf, "%llx", &input[k][0]); i = 0; for (;;) { ret = read(fd, buf2 + i, 1); if (ret != 1 || *(buf2 + i) == '\n') { buf2[i] = '\0'; break; } i++; } sscanf(buf2, "%llx", &input[k][1]); } return (0); } int main(int argc, char *argv[]) { if (argc != 2) { printf("Usage: ./program file \n"); exit(-1); } parse_file(argv[1]); hash_me(); return (0); }