mirror of
https://github.com/openappsec/openappsec.git
synced 2025-10-01 20:17:43 +03:00
First release of open-appsec source code
This commit is contained in:
586
components/utils/pm/kiss_hash.h
Normal file
586
components/utils/pm/kiss_hash.h
Normal file
@@ -0,0 +1,586 @@
|
||||
// Copyright (C) 2022 Check Point Software Technologies Ltd. All rights reserved.
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
#ifndef __KISS_HASH_H__
|
||||
#define __KISS_HASH_H__
|
||||
|
||||
#include "general_adaptor.h"
|
||||
|
||||
typedef struct kiss_hash *kiss_hash_t;
|
||||
|
||||
struct kiss_hashent {
|
||||
void *key;
|
||||
void *val;
|
||||
struct kiss_hashent *next;
|
||||
};
|
||||
|
||||
typedef uintptr_t (*hkeyfunc_t)(const void *key, void *info);
|
||||
typedef int (*hcmpfunc_t)(const void *key1, const void *key2, void *info);
|
||||
typedef void (*freefunc_t)(void *info);
|
||||
|
||||
// {group: API for KISS_HASH}
|
||||
#define H_DESTR(destr, addr) \
|
||||
if (destr && (((uintptr_t)(addr)) > 0x10)) (*destr)(addr);
|
||||
|
||||
// {group: API for KISS_HASH}
|
||||
// Description: Create Hash Table. MT-Level: Reentrant
|
||||
// Parameters:
|
||||
// hsize - hash size
|
||||
// keyfunc - key hashing function
|
||||
// keycmp - key comparison function
|
||||
// info - opaque for use of keyfunc and keycmp functions.
|
||||
// Return values:
|
||||
// o hash pointer
|
||||
// o NULL upon failure
|
||||
// See also: kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr, kiss_hash_undo_destr,
|
||||
// kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey, kiss_hash_insert,
|
||||
// kiss_hash_delete, kiss_hash_destroy, kiss_hash_find_kiss_hashent, kiss_hash_insert_at, kiss_hash_strvalue,
|
||||
// kiss_hash_strcmp, kiss_hash_intvalue, kiss_hash_bytevalue,
|
||||
// kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
|
||||
kiss_hash_t kiss_hash_create (size_t hsize, hkeyfunc_t keyfunc, hcmpfunc_t keycmp, void *info);
|
||||
|
||||
// {group: API for HASH}
|
||||
// Description: Create Hash Table with Destructor. MT-Level: Reentrant
|
||||
// Parameters:
|
||||
// hsize - hash size
|
||||
// keyfunc - key hashing function
|
||||
// keycmp - key comparison function
|
||||
// val_destr - destructor for the values of the hash
|
||||
// key_destr - destructor for the keys of the hash
|
||||
// info - opaque for use of keyfunc and keycmp functions.
|
||||
// Return values:
|
||||
// o hash pointer
|
||||
// o NULL upon failure
|
||||
// See also: kiss_hash_create, kiss_hash_set_destr, kiss_hash_dodestr, kiss_hash_undo_destr, kiss_hash_nelements,
|
||||
// iss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey, kiss_hash_insert, kiss_hash_delete, kiss_hash_destroy,
|
||||
// kiss_hash_find_kiss_hashent, kiss_hash_insert_at, kiss_hash_strvalue, kiss_hash_strcmp, kiss_hash_intvalue,
|
||||
// kiss_hash_bytevalue, kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
|
||||
kiss_hash_t
|
||||
kiss_hash_create_with_destr (
|
||||
size_t hsize,
|
||||
hkeyfunc_t keyfunc,
|
||||
hcmpfunc_t keycmp,
|
||||
freefunc_t val_destr,
|
||||
freefunc_t key_destr,
|
||||
void *info
|
||||
);
|
||||
|
||||
#define kiss_hash_create(hsize, hkeyfunc, hcmpfunc, info) \
|
||||
_kiss_hash_create (hsize, hkeyfunc, hcmpfunc, info, __FILE__, __LINE__)
|
||||
|
||||
#define kiss_hash_create_with_destr(hsize, hkeyfunc, hcmpfunc, freefunc1, freefunc2, info) \
|
||||
_kiss_hash_create_with_destr (hsize, hkeyfunc, hcmpfunc, freefunc1, freefunc2, info, __FILE__, __LINE__)
|
||||
|
||||
kiss_hash_t
|
||||
_kiss_hash_create_with_ksleep(size_t hsize, hkeyfunc_t, hcmpfunc_t, void *info, const char *file, int line);
|
||||
|
||||
#define kiss_hash_create_with_ksleep(hsize, hkeyfunc, hcmpfunc, info) \
|
||||
_kiss_hash_create_with_ksleep (hsize, hkeyfunc, hcmpfunc, info, __FILE__, __LINE__)
|
||||
|
||||
|
||||
// {group: API for HASH}
|
||||
// Description: Debug single hash. MT-Level: Reentrant
|
||||
//This function calculates and prints the following statistics:
|
||||
//o hash pointer
|
||||
//o file name and line number where kiss_hash_create or kiss_hash_create_with_destr was called
|
||||
//o number of elements in kiss_hash
|
||||
//o number of slots in hash - hash size
|
||||
//o size in bytes of memory occupied by hash maintenance structures
|
||||
//o slot utilzation - percentage of hash slots used to store elements
|
||||
//o average number of lookups - average length of lists of elements
|
||||
// Parameters:
|
||||
// hash - pointer to hash
|
||||
// Return values:
|
||||
// size in bytes of memory occupied by hash maintenance structures.
|
||||
// See also: hash_create, hash_create_with_destr, hash_set_destr, hash_dodestr, hash_undo_destr,
|
||||
// hash_nelements, hash_findaddr, hash_lookup, hash_lookkey, hash_insert, hash_delete, hash_destroy,
|
||||
// hash_find_hashent, hash_insert_at, hash_strvalue, hash_strcmp, hash_intvalue, hash_bytevalue,
|
||||
// hash_bytecmp, hash_debug_all
|
||||
int kiss_hash_debug(kiss_hash_t hp);
|
||||
|
||||
// {group: API for HASH}
|
||||
// Description: Debug single hash. MT-Level: Safe
|
||||
//Iterates a list of all hash tables craeted in the current process and
|
||||
//for each hash calls function hash_debug. In addition the total
|
||||
//memory usage of hash maintenance structures is printed.
|
||||
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
|
||||
// kiss_hash_undo_destr, kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey,
|
||||
// kiss_hash_insert, kiss_hash_delete, kiss_hash_destroy,
|
||||
// kiss_hash_find_kiss_hashent, kiss_hash_insert_at, kiss_hash_strvalue, kiss_hash_strcmp, kiss_hash_intvalue,
|
||||
// kiss_hash_bytevalue, kiss_hash_bytecmp, kiss_hash_debug
|
||||
void kiss_hash_debug_all();
|
||||
|
||||
// {group: API for kiss_hash}
|
||||
kiss_hash_t _kiss_hash_create (size_t hsize, hkeyfunc_t, hcmpfunc_t, void *info, const char *file, int line);
|
||||
|
||||
// {group: API for HASH}
|
||||
kiss_hash_t _kiss_hash_create_with_destr (size_t hsize, hkeyfunc_t, hcmpfunc_t, freefunc_t, freefunc_t,
|
||||
void *info, const char *file, int line);
|
||||
|
||||
// {group: API for HASH}
|
||||
// Description: Set destructor for hash elements. MT-Level: ] Reentrant
|
||||
//Keys and values detsructors are called for every hash key-value pair when the hash is destroyed.
|
||||
// Parameters:
|
||||
// hp - hash
|
||||
// val_destr - destructor for the values of the hash
|
||||
// key_destr - destructor for the keys of the hash
|
||||
// Return values:
|
||||
// hash pointer
|
||||
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_dodestr, kiss_hash_undo_destr,
|
||||
// kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey, kiss_hash_insert,
|
||||
// kiss_hash_delete, kiss_hash_destroy, kiss_hash_find_kiss_hashent, kiss_hash_insert_at, kiss_hash_strvalue,
|
||||
// kiss_hash_strcmp, kiss_hash_intvalue, kiss_hash_bytevalue,
|
||||
// kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
|
||||
kiss_hash_t kiss_hash_set_destr (kiss_hash_t hp, freefunc_t val_destr, freefunc_t key_destr);
|
||||
|
||||
// {group: API for kiss_hash}
|
||||
// Description: Enable hash element detsruction. MT-Level: Reentrant
|
||||
//Hash is created with destruction of elements disabled by default.
|
||||
//This function enables destruction upon a call to kiss_hash_destroy.
|
||||
//Meaning, the hash will automaticly call destructors when an entry gets
|
||||
//deleted from the hash. Usualy this is not the case !
|
||||
// Parameters:
|
||||
// hp - hash
|
||||
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_undo_destr,
|
||||
// kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey, kiss_hash_insert,
|
||||
// kiss_hash_delete, kiss_hash_destroy, kiss_hash_find_kiss_hashent, kiss_hash_insert_at, kiss_hash_strvalue,
|
||||
// kiss_hash_strcmp, kiss_hash_intvalue, kiss_hash_bytevalue,
|
||||
// kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
|
||||
void kiss_hash_dodestr (kiss_hash_t hp);
|
||||
|
||||
// {group: API for HASH}
|
||||
// Description: Disable hash element detsruction. MT-Level: Reentrant
|
||||
// Parameters:
|
||||
// hp - hash
|
||||
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
|
||||
// kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey, kiss_hash_insert,
|
||||
// kiss_hash_delete, kiss_hash_destroy,
|
||||
// kiss_hash_find_kiss_hashent, kiss_hash_insert_at, kiss_hash_strvalue, kiss_hash_strcmp, kiss_hash_intvalue,
|
||||
// kiss_hash_bytevalue, kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
|
||||
void kiss_hash_undo_destr (kiss_hash_t hp);
|
||||
|
||||
// {group: API for HASH}
|
||||
// Description: Number of hash elements. MT-Level: Reentrant
|
||||
// Parameters:
|
||||
// hash - hash table
|
||||
// Return values:
|
||||
// number of elements
|
||||
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
|
||||
// kiss_hash_undo_destr, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey, kiss_hash_insert,
|
||||
// kiss_hash_delete, kiss_hash_destroy,
|
||||
// kiss_hash_find_kiss_hashent, kiss_hash_insert_at, kiss_hash_strvalue, kiss_hash_strcmp, kiss_hash_intvalue,
|
||||
// kiss_hash_bytevalue, kiss_hash_bytecmp, kiss_kiss_hash_debug, kiss_hash_debug_all
|
||||
int kiss_hash_nelements (kiss_hash_t hash);
|
||||
|
||||
// {group: API for HASH}
|
||||
// Description: Hash size. MT-Level: Reentrant
|
||||
// Parameters:
|
||||
// hash - hash table
|
||||
// Return values:
|
||||
// Size of hash
|
||||
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
|
||||
// kiss_hash_undo_destr, kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey,
|
||||
// kiss_hash_insert, kiss_hash_delete, kiss_hash_destroy, kiss_hash_find_hashent, kiss_hash_insert_at,
|
||||
// kiss_hash_strvalue, kiss_hash_strcmp, kiss_hash_intvalue, kiss_hash_bytevalue,
|
||||
// kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
|
||||
int kiss_hash_get_size (kiss_hash_t hash);
|
||||
|
||||
// {group: API for HASH}
|
||||
// Description: Return address of the pointer to the value in the hash table.
|
||||
// Parameters:
|
||||
// hp - hash pointer
|
||||
// key - hash key
|
||||
// Return values:
|
||||
// hash entry
|
||||
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
|
||||
// kiss_hash_undo_destr, kiss_hash_nelements, kiss_hash_lookup, kiss_hash_lookkey, kiss_hash_insert,
|
||||
// kiss_hash_delete, kiss_hash_destroy,
|
||||
// kiss_hash_find_hashent, kiss_hash_insert_at, kiss_hash_strvalue, kiss_hash_strcmp, kiss_hash_intvalue,
|
||||
// kiss_hash_bytevalue, kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
|
||||
void **kiss_hash_findaddr (kiss_hash_t hp, const void *key);
|
||||
|
||||
// {group: API for HASH}
|
||||
// Description: Lookup hash value. MT-Level: Reentrant
|
||||
// Parameters:
|
||||
// hp - hash pointer
|
||||
// key - hash key
|
||||
// Return values:
|
||||
// o hash value
|
||||
// o NULL upon failure
|
||||
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
|
||||
// kiss_hash_undo_destr, kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookkey, kiss_hash_insert,
|
||||
// kiss_hash_delete, kiss_hash_destroy, kiss_hash_find_hashent, kiss_hash_insert_at, kiss_hash_strvalue,
|
||||
// kiss_hash_strcmp, kiss_hash_intvalue, kiss_hash_bytevalue,
|
||||
// kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
|
||||
void *kiss_hash_lookup (kiss_hash_t hp, const void *key);
|
||||
|
||||
// {group: API for HASH}
|
||||
// Description: Lookup hash key. MT-Level: Reentrant
|
||||
//Returns the key pointer as stored in the hash table.
|
||||
// Parameters:
|
||||
// hp - hash pointer
|
||||
// key - hash key that hash a value equal to that of the key stored in the hash.
|
||||
// Return values:
|
||||
// o hash key
|
||||
// o NULL upon failure
|
||||
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
|
||||
// kiss_hash_undo_destr, kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_insert,
|
||||
// kiss_hash_delete, kiss_hash_destroy,kiss_hash_find_hashent, kiss_hash_insert_at, kiss_hash_strvalue,
|
||||
// kiss_hash_strcmp, kiss_hash_intvalue, kiss_hash_bytevalue,
|
||||
// kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
|
||||
void *kiss_hash_lookkey (kiss_hash_t hp, const void *key);
|
||||
|
||||
// {group: API for HASH}
|
||||
// Description: Insert hash element. MT-Level: Reentrant
|
||||
// Parameters:
|
||||
// hp - hash pointer
|
||||
// key - hash key
|
||||
// val - hash val
|
||||
// Return values:
|
||||
// >0 - success
|
||||
// 0 - upon failure
|
||||
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
|
||||
// kiss_hash_undo_destr, kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey,
|
||||
// kiss_hash_delete, kiss_hash_destroy, kiss_hash_find_hashent, kiss_hash_insert_at, kiss_hash_strvalue,
|
||||
// kiss_hash_strcmp, kiss_hash_intvalue, kiss_hash_bytevalue,
|
||||
// kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
|
||||
int kiss_hash_insert (kiss_hash_t hp, void *key, void *val);
|
||||
|
||||
// {group: API for HASH}
|
||||
// Description: Delete hash element. MT-Level: Reentrant
|
||||
//Delete hash element and return a value for the key.
|
||||
// Parameters:
|
||||
// hp - hash pointer
|
||||
// key - hash key
|
||||
// Return values:
|
||||
// o hash val
|
||||
// o NULL upon failure
|
||||
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
|
||||
// kiss_hash_undo_destr, kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey,
|
||||
// kiss_hash_insert, kiss_hash_destroy, kiss_hash_find_hashent, kiss_hash_insert_at, kiss_hash_strvalue,
|
||||
// kiss_hash_strcmp, kiss_hash_intvalue, kiss_hash_bytevalue,
|
||||
// kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
|
||||
void *kiss_hash_delete (kiss_hash_t hash, const void *key);
|
||||
|
||||
// {group: API for HASH}
|
||||
// Description: Destroy hash. MT-Level: Reentrant
|
||||
//If detsructor functions were defined in the call to kiss_hash_with_create_destr or kiss_hash_set_destr
|
||||
//function kiss_hash_dodestr must be called to enable element detsruction.
|
||||
// Parameters:
|
||||
// hp - hash pointer
|
||||
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
|
||||
// kiss_hash_undo_destr,kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey,
|
||||
// kiss_hash_insert, kiss_hash_delete, kiss_hash_find_hashent, kiss_hash_insert_at, kiss_hash_strvalue,
|
||||
// kiss_hash_strcmp, kiss_hash_intvalue, kiss_hash_bytevalue, kiss_hash_bytecmp, kiss_hash_debug,
|
||||
// kiss_hash_debug_all
|
||||
void kiss_hash_destroy (kiss_hash_t hp);
|
||||
|
||||
// {group: API for HASH}
|
||||
// Description: Find hash entry. MT-Level: Reentrant
|
||||
//Used as an efficient but somewhat ugly interface for find/insert operation.
|
||||
//What it does is to return an adrress of a pointer to a hashent structure containing the key/val pair if found.
|
||||
//If not it returns the address of the pointer in which we can append the new val/pair
|
||||
//thus avoiding an unnceccessary repeated search.
|
||||
//We can check if key was found by checking whether the pointer is zero or not.
|
||||
//This function is usually used with kiss_hash_insert_at.
|
||||
// Parameters:
|
||||
// hp - hash pointer
|
||||
// key - hash key
|
||||
// Return values:
|
||||
// hash entry
|
||||
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
|
||||
// kiss_hash_undo_destr, kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey,
|
||||
// kiss_hash_insert, kiss_hash_delete, kiss_hash_destroy, kiss_hash_insert_at, kiss_hash_strvalue, kiss_hash_strcmp,
|
||||
// kiss_hash_intvalue, kiss_hash_bytevalue, kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
|
||||
struct kiss_hashent ** kiss_hash_find_hashent(kiss_hash_t hp, const void *key);
|
||||
|
||||
// {group: API for HASH}
|
||||
// Description: Insert hash element at specified position. MT-Level: Reentrant
|
||||
//This function should be used together with kiss_hash_find_hashent to insert
|
||||
//the value in case it was not found at the hash.
|
||||
// Parameters:
|
||||
// hp - hash pointer
|
||||
// key - hash key
|
||||
// val - hash val
|
||||
// hloc -
|
||||
// Return values:
|
||||
// o 0 upon failure
|
||||
// o number of hash elements after insertion in case of success.
|
||||
// See also: kiss_hash_create, kiss_hash_create_with_destr, kiss_hash_set_destr, kiss_hash_dodestr,
|
||||
// kiss_hash_undo_destr, kiss_hash_nelements, kiss_hash_findaddr, kiss_hash_lookup, kiss_hash_lookkey,
|
||||
// kiss_hash_insert, kiss_hash_delete,
|
||||
// kiss_hash_destroy, kiss_hash_find_hashent, kiss_hash_strvalue, kiss_hash_strcmp, kiss_hash_intvalue,
|
||||
// kiss_hash_bytevalue, kiss_hash_bytecmp, kiss_hash_debug, kiss_hash_debug_all
|
||||
int kiss_hash_insert_at (kiss_hash_t hp, void *key, void *val, struct kiss_hashent**hloc);
|
||||
|
||||
|
||||
#define kiss_hash_strcreate(sz) \
|
||||
kiss_hash_create(sz, (hkeyfunc_t)kiss_hash_strvalue, (hcmpfunc_t)kiss_hash_strcmp, NULL)
|
||||
|
||||
#define kiss_hash_intcreate(sz) \
|
||||
kiss_hash_create(sz, (hkeyfunc_t)kiss_hash_intvalue, (hcmpfunc_t)kiss_hash_intcmp, NULL)
|
||||
|
||||
#define kiss_hash_bytecreate(n, esz) \
|
||||
kiss_hash_create(n, (hkeyfunc_t)kiss_hash_bytevalue, (hcmpfunc_t)kiss_hash_bytecmp, (void *)esz)
|
||||
|
||||
// The following provide hash table data type interface,
|
||||
// These functions can be provided by the user,
|
||||
// The default provided functions provide string hash
|
||||
|
||||
// {group: API for HASH}
|
||||
// Description: Hashing fuction for string hash.
|
||||
//This function is used by kiss_hash_strcreate().
|
||||
// Parameters:
|
||||
// vs - key
|
||||
// info - opaque
|
||||
// Return values:
|
||||
// value of the hash function.
|
||||
uintptr_t kiss_hash_strvalue (const void *vs, void *info);
|
||||
|
||||
// {group: API for HASH}
|
||||
// Description: Comparison fuction for string hash.
|
||||
//This function is used by kiss_hash_strcreate().
|
||||
// Parameters:
|
||||
// vk1 - key
|
||||
// vk2 - key
|
||||
// info - opaque
|
||||
// Return values:
|
||||
// 0 - keys are equal
|
||||
// !0 - keys are different
|
||||
int kiss_hash_strcmp (const void *vk1, const void *vk2, void *info);
|
||||
|
||||
// {group: API for HASH}
|
||||
// Description: Hashing fuction for integer hash.
|
||||
//This function is used by kiss_hash_intcreate().
|
||||
// Parameters:
|
||||
// v - key
|
||||
// info - opaque
|
||||
// Return values:
|
||||
// value of the hash function.
|
||||
uintptr_t kiss_hash_intvalue (const void* v, void *info);
|
||||
|
||||
// {group: API for HASH}
|
||||
// Description: Comparison fuction for integer hash.
|
||||
//This function is used by kiss_hash_intcreate().
|
||||
// Parameters:
|
||||
// vv1 - key
|
||||
// vv2 - key
|
||||
// info - opaque
|
||||
// Return values:
|
||||
// 0 - keys are equal
|
||||
// !0 - keys are different
|
||||
int kiss_hash_intcmp (const void* vv1, const void* vv2, void *info);
|
||||
|
||||
// {group: API for HASH}
|
||||
// Description: Hashing fuction for byte hash.
|
||||
//This function is used by kiss_hash_bytecreate().
|
||||
// Parameters:
|
||||
// data - key
|
||||
// info - opaque
|
||||
// Return values:
|
||||
// value of the hash function.
|
||||
uintptr_t kiss_hash_bytevalue (const void *data, void *info);
|
||||
|
||||
// {group: API for HASH}
|
||||
// Description: Comparison fuction for byte hash.
|
||||
//This function is used by kiss_hash_bytecreate().
|
||||
// Parameters:
|
||||
// d1 - key
|
||||
// d2 - key
|
||||
// info - opaque
|
||||
// Return values:
|
||||
// 0 - keys are equal
|
||||
// !0 - keys are different
|
||||
int kiss_hash_bytecmp (const void *d1, const void *d2, void *info);
|
||||
|
||||
// {group: API for HASH ITERATOR}
|
||||
typedef struct kiss_hash_iter *kiss_hash_iterator;
|
||||
|
||||
// {group: API for HASH ITERATOR}
|
||||
// Description: Create hash iterator. MT-Level: Reentrant
|
||||
// Parameters:
|
||||
// hp - hash
|
||||
// Return values:
|
||||
// o iterator object
|
||||
// o NULL upon failure
|
||||
// See also:
|
||||
// kiss_hash_iterator_next, kiss_hash_iterator_next_key, kiss_hash_iterator_destroy
|
||||
kiss_hash_iterator kiss_hash_iterator_create (kiss_hash_t hp);
|
||||
|
||||
// {group: API for HASH ITERATOR}
|
||||
// Description: Return next hash value. MT-Level: Reentrant
|
||||
// Parameters:
|
||||
// hit - hash iterator
|
||||
// Return values:
|
||||
// o next hash value
|
||||
// o NULL upon failure
|
||||
// See also:
|
||||
// kiss_hash_iterator_create, kiss_hash_iterator_next_key, kiss_hash_iterator_destroy
|
||||
void *kiss_hash_iterator_next (kiss_hash_iterator hit);
|
||||
|
||||
// {group: API for HASH ITERATOR}
|
||||
// Description: Return next hash key. MT-Level: Reentrant
|
||||
// Parameters:
|
||||
// hit - hash iterator
|
||||
// Return values:
|
||||
// o next hash key
|
||||
// o NULL upon failure
|
||||
// See also:
|
||||
// kiss_hash_iterator_create, kiss_hash_iterator_next, kiss_hash_iterator_destroy
|
||||
void *kiss_hash_iterator_next_key (kiss_hash_iterator hit);
|
||||
|
||||
// {group: API for HASH ITERATOR}
|
||||
// Description: Destroy hash iterator. MT-Level: Reentrant
|
||||
// Parameters:
|
||||
// hit - hash iterator
|
||||
// See also:
|
||||
// kiss_hash_iterator_create, kiss_hash_iterator_next, kiss_hash_iterator_next_key
|
||||
void kiss_hash_iterator_destroy (kiss_hash_iterator hit);
|
||||
|
||||
// {group: API for ITERATOR}
|
||||
int kiss_hash_iterator_next_ent(kiss_hash_iterator hit);
|
||||
|
||||
// {group: API for ITERATOR}
|
||||
void * kiss_hash_iterator_get_key(kiss_hash_iterator hit);
|
||||
|
||||
// {group: API for ITERATOR}
|
||||
void * kiss_hash_iterator_get_val(kiss_hash_iterator hit);
|
||||
|
||||
// {group: API for ITERATOR}
|
||||
struct kiss_hashent * kiss_hash_iterator_get_hashent(kiss_hash_iterator hit);
|
||||
|
||||
// {group: API for ITERATOR}
|
||||
int kiss_hash_iterator_equal(kiss_hash_iterator hit1, kiss_hash_iterator hit2);
|
||||
|
||||
// {group: API for ITERATOR}
|
||||
kiss_hash_iterator kiss_hash_iterator_copy(kiss_hash_iterator hit);
|
||||
|
||||
// {group: API for ITERATOR}
|
||||
void kiss_hash_iterator_free(kiss_hash_iterator hit);
|
||||
|
||||
// {group: API for ITERATOR}
|
||||
void kiss_hash_iterator_set_begin(kiss_hash_iterator hit);
|
||||
|
||||
// {group: API for ITERATOR}
|
||||
void kiss_hash_iterator_set_end(kiss_hash_iterator hit);
|
||||
|
||||
// {group: API for HASH}
|
||||
kiss_hash_iterator kiss_hash_find_hashent_new(kiss_hash_t hp, const void *key);
|
||||
|
||||
// {group: API for HASH ITERATOR}
|
||||
void kiss_hash_delete_by_iter(kiss_hash_iterator hit);
|
||||
|
||||
// - - - - - - - - - - - - - - -
|
||||
// Hash resize mechanism
|
||||
// - - - - - - - - - - - - - - -
|
||||
|
||||
// {group: API for HASH RESIZE}
|
||||
// Determine if hash size can increase, decrease or both.
|
||||
typedef enum {
|
||||
KISS_HASH_SIZE_STATIC = 0, // hash size is kept fixed
|
||||
KISS_HASH_SIZE_INCREASE = 1,
|
||||
KISS_HASH_SIZE_DECREASE = 2,
|
||||
KISS_HASH_SIZE_INC_DEC = 3
|
||||
} KissHashResizeDirection;
|
||||
|
||||
// {group: API for HASH RESIZE}
|
||||
typedef enum {
|
||||
KISS_HASH_RESIZE_METHOD_UNKNOWN = 0,
|
||||
KISS_HASH_RESIZE_BY_FACTOR = 1
|
||||
} KissHashResizeMethod;
|
||||
|
||||
// {group: API for HASH RESIZE}
|
||||
// Default maximal hash size:
|
||||
// Hash size will not increase beyond this value unless stated o/w by the application
|
||||
#define DEFAULT_KISS_HASH_SIZE (1<<17)
|
||||
|
||||
// {group: API for HASH RESIZE}
|
||||
// Default value for hash factorial resizing
|
||||
#define DEFAULT_KISS_HASH_RESIZE_FACTOR_VALUE 4
|
||||
// {group: API for HASH RESIZE}
|
||||
// Default value for hash factorial resizing trigger ratio
|
||||
#define DEFAULT_KISS_HASH_RESIZE_FACTOR_TRIG_RATIO 2
|
||||
|
||||
// {group: API for HASH RESIZE}
|
||||
// Resize application callback: This callback will be invoked at every successful resize operation.
|
||||
typedef int (* HashResizeCb_t) (kiss_hash_t hp, void *app_info);
|
||||
|
||||
|
||||
// Hash resize mode object & accsess API.
|
||||
// Used for setting resize parameters hash.
|
||||
|
||||
// {group: API for HASH RESIZE}
|
||||
typedef struct _KissHashResizeMode KissHashResizeMode;
|
||||
|
||||
// {group: API for HASH RESIZE}
|
||||
int KissHashResizeMode_create(KissHashResizeMode **resize_mode);
|
||||
|
||||
// {group: API for HASH RESIZE}
|
||||
void KissHashResizeMode_destroy(KissHashResizeMode *resize_mode);
|
||||
|
||||
// {group: API for HASH RESIZE}
|
||||
int KissHashResizeMode_set_method(
|
||||
KissHashResizeMode *resize_mode,
|
||||
KissHashResizeMethod method,
|
||||
u_int value,
|
||||
u_int trigger_ratio);
|
||||
|
||||
// {group: API for HASH RESIZE}
|
||||
int KissHashResizeMode_get_method(
|
||||
const KissHashResizeMode *resize_mode,
|
||||
KissHashResizeMethod *method,
|
||||
u_int *value,
|
||||
u_int *trigger_ratio);
|
||||
|
||||
// {group: API for HASH RESIZE}
|
||||
int KissHashResizeMode_set_direction(KissHashResizeMode *resize_mode, KissHashResizeDirection direction);
|
||||
|
||||
// {group: API for HASH RESIZE}
|
||||
int KissHashResizeMode_get_direction(const KissHashResizeMode *resize_mode, KissHashResizeDirection *direction);
|
||||
|
||||
// {group: API for HASH RESIZE}
|
||||
int KissHashResizeMode_set_max_size(KissHashResizeMode *resize_mode, u_int max_size);
|
||||
|
||||
// {group: API for HASH RESIZE}
|
||||
int KissHashResizeMode_get_max_size(const KissHashResizeMode *resize_mode, u_int *max_size);
|
||||
|
||||
// {group: API for HASH RESIZE}
|
||||
int kiss_hash_set_resize_cb(kiss_hash_t hp, HashResizeCb_t resize_callback);
|
||||
|
||||
// {group: API for HASH RESIZE}
|
||||
// Description: Set hash dynamic size parameters.
|
||||
// Parameters:
|
||||
// hp - [in] pointer to hash table
|
||||
// resize_mode - [in] should be created and set using the access API to the KissHashResizeMode object.
|
||||
// After using the set API, this object can be destroyed.
|
||||
//
|
||||
int kiss_hash_set_dynamic_size(kiss_hash_t hp, const KissHashResizeMode *resize_mode);
|
||||
|
||||
// {group: API for HASH RESIZE}
|
||||
// Description: Get hash dynamic size parameters.
|
||||
// Parameters:
|
||||
// hp - [in] pointer to hash table
|
||||
// resize_mode - [out] a read-only parameter that should not be changed by the application.
|
||||
int kiss_hash_get_dynamic_size(kiss_hash_t hp, const KissHashResizeMode **resize_mode);
|
||||
|
||||
// {group: API for HASH RESIZE}
|
||||
// Description: This API will cause an immediate resizing of hash
|
||||
// table, according to the parameters, given in the input
|
||||
// KissHashResizeMode object (if NULL, the resize will be done
|
||||
// according to the parameters as last set by the application).
|
||||
//
|
||||
// Note that the KissHashResizeMode object parameters are
|
||||
// not kept on the hash handle for future resize oprations.
|
||||
int kiss_hash_trigger_resize(kiss_hash_t hp, const KissHashResizeMode *resize_mode);
|
||||
|
||||
#endif // __KISS_HASH_H__
|
Reference in New Issue
Block a user