Add hashing function, hashtable struct, and hashtable init function
This commit is contained in:
parent
2661d781da
commit
21dcb50d79
3 changed files with 93 additions and 1 deletions
15
.clang-format
Executable file
15
.clang-format
Executable file
|
|
@ -0,0 +1,15 @@
|
||||||
|
#BasedOnStyle: None
|
||||||
|
AlignTrailingComments: true
|
||||||
|
BreakBeforeBraces: Allman
|
||||||
|
ColumnLimit: 0
|
||||||
|
IndentWidth: 4
|
||||||
|
KeepEmptyLinesAtTheStartOfBlocks: false
|
||||||
|
ObjCSpaceAfterProperty: true
|
||||||
|
ObjCSpaceBeforeProtocolList: true
|
||||||
|
PointerBindsToType: false
|
||||||
|
SpacesBeforeTrailingComments: 1
|
||||||
|
TabWidth: 4
|
||||||
|
UseTab: Never
|
||||||
|
|
||||||
|
AlignArrayOfStructures: Right
|
||||||
|
SpaceBeforeSquareBrackets: false
|
||||||
15
.gitignore
vendored
15
.gitignore
vendored
|
|
@ -36,7 +36,8 @@
|
||||||
*.i*86
|
*.i*86
|
||||||
*.x86_64
|
*.x86_64
|
||||||
*.hex
|
*.hex
|
||||||
|
eipaasm
|
||||||
|
eipaasm_debug
|
||||||
# Debug files
|
# Debug files
|
||||||
*.dSYM/
|
*.dSYM/
|
||||||
*.su
|
*.su
|
||||||
|
|
@ -52,3 +53,15 @@ Module.symvers
|
||||||
Mkfile.old
|
Mkfile.old
|
||||||
dkms.conf
|
dkms.conf
|
||||||
|
|
||||||
|
#EIPA specific
|
||||||
|
*.eipa
|
||||||
|
!test*.eipa
|
||||||
|
*.eipaimg
|
||||||
|
|
||||||
|
#Code editor
|
||||||
|
.vscode/*
|
||||||
|
compile_commands.json
|
||||||
|
.cache/*
|
||||||
|
|
||||||
|
#Code analysis
|
||||||
|
softwipe*.*
|
||||||
64
main.c
Normal file
64
main.c
Normal file
|
|
@ -0,0 +1,64 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <builtins.h>
|
||||||
|
|
||||||
|
#define WORD 32
|
||||||
|
#define RAND_MAX 4294967296
|
||||||
|
#define DELTA 1
|
||||||
|
|
||||||
|
#define rot32_left(x, y) __builtin_rotateleft32(x, y)
|
||||||
|
|
||||||
|
// Contains everything the functions for the hashtables need, to work with, including the hash table itself
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned int *transformation_table;
|
||||||
|
void *hash_table;
|
||||||
|
unsigned int table_size;
|
||||||
|
}shash_hashtable_t;
|
||||||
|
|
||||||
|
void shash_init_hashtable(shash_hashtable_t *hashtable, unsigned int table_size)
|
||||||
|
{
|
||||||
|
// Create a random transformation table
|
||||||
|
srand(time(NULL));
|
||||||
|
unsigned int *table = malloc((CHAR_MAX-CHAR_MIN)*sizeof(int));
|
||||||
|
|
||||||
|
for(int i = 0; i < CHAR_MAX-CHAR_MIN; i++){
|
||||||
|
table[i] = rand();
|
||||||
|
}
|
||||||
|
hashtable->transformation_table = table;
|
||||||
|
|
||||||
|
hashtable->hash_table = malloc(table_size * sizeof(void *));
|
||||||
|
hashtable->table_size = table_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int shash_hash(char *key, unsigned int len, shash_hashtable_t *hashtable)
|
||||||
|
{
|
||||||
|
//Slight variation of cyclic polynomial hasing, as described in the Paper: "Recursive Hashing functions for n-Grams" by J. D. Cohen
|
||||||
|
unsigned int hash_word = 0;
|
||||||
|
for(int i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
hash_word = rot32_left(hash_word, DELTA);
|
||||||
|
hash_word = hash_word ^ hashtable->transformation_table[key[i]];
|
||||||
|
}
|
||||||
|
|
||||||
|
return hash_word % hashtable->table_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
void shash_set(char *key, unsigned int len, shash_hashtable_t *hashtable)
|
||||||
|
{
|
||||||
|
//unsigned int hash = shash_hash(key, len, 1000,[1,]);
|
||||||
|
//printf("%u\n", hash);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
// Initialize an empty hashtable
|
||||||
|
shash_hashtable_t hashtable;
|
||||||
|
shash_init_hashtable(&hashtable, 100);
|
||||||
|
|
||||||
|
printf("%d\n", shash_hash("INC",3,&hashtable));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue