Skip to content

Instantly share code, notes, and snippets.

@airportyh
Created May 17, 2021 15:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save airportyh/ec5fe5f9a766ee042e2c1cfc1bf8c5b7 to your computer and use it in GitHub Desktop.
Save airportyh/ec5fe5f9a766ee042e2c1cfc1bf8c5b7 to your computer and use it in GitHub Desktop.
#include <stdio.h>
#include <string.h>
// Code below is from http://www.azillionmonkeys.com/qed/hash.html
#include <stdint.h>
#undef get16bits
#if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) \
|| defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__)
#define get16bits(d) (*((const uint16_t *) (d)))
#endif
#if !defined (get16bits)
#define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\
+(uint32_t)(((const uint8_t *)(d))[0]) )
#endif
uint32_t SuperFastHash (const char * data, int len) {
uint32_t hash = len, tmp;
int rem;
if (len <= 0 || data == NULL) return 0;
rem = len & 3;
len >>= 2;
/* Main loop */
for (;len > 0; len--) {
hash += get16bits (data);
tmp = (get16bits (data+2) << 11) ^ hash;
hash = (hash << 16) ^ tmp;
data += 2*sizeof (uint16_t);
hash += hash >> 11;
}
/* Handle end cases */
switch (rem) {
case 3: hash += get16bits (data);
hash ^= hash << 16;
hash ^= ((signed char)data[sizeof (uint16_t)]) << 18;
hash += hash >> 11;
break;
case 2: hash += get16bits (data);
hash ^= hash << 11;
hash += hash >> 17;
break;
case 1: hash += (signed char)*data;
hash ^= hash << 10;
hash += hash >> 1;
}
/* Force "avalanching" of final 127 bits */
hash ^= hash << 3;
hash += hash >> 5;
hash ^= hash << 4;
hash += hash >> 17;
hash ^= hash << 25;
hash += hash >> 6;
return hash;
}
int main() {
FILE *file;
ssize_t read;
size_t len;
char * line = NULL;
file = fopen("all_commands.txt", "r");
if (file == NULL) {
printf("Could not open file.\n");
return 1;
}
while (1) {
read = getline(&line, &len, file);
if (read == -1) {
break;
}
int length = strlen(line);
uint32_t hash = SuperFastHash(line, length - 1);
unsigned int idx = hash % 997;
printf("%u %u %s", hash, idx, line);
}
// uint32_t hash = SuperFastHash("hello", 5);
// printf("Result: %u\n", hash);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment