Author: Pekka Riikonen <priikone@silcnet.org>
- Copyright (C) 2001 - 2003 Pekka Riikonen
+ Copyright (C) 2001 - 2005 Pekka Riikonen
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#endif
/* Default size of the hash table (index to prime table) */
-#define SILC_HASH_TABLE_SIZE 3
+#define SILC_HASH_TABLE_SIZE 2
/* Produce the index by hashing the key */
#define SILC_HASH_TABLE_HASH(f, c) \
/* Prime sizes for the hash table. The size of the table will always
be one of these. */
-const SilcUInt32 primesize[42] =
+const SilcUInt32 primesize[] =
{
- 1, 3, 5, 11, 17, 37, 67, 109, 131, 163, 257, 367, 521, 823, 1031,
- 1237, 2053, 2777, 4099, 6247, 8209, 14057, 16411, 21089, 32771, 47431,
- 65537, 106721, 131101, 262147, 360163, 524309, 810343, 1048583, 2097169,
- 4194319, 6153409, 8388617, 13845163, 16777259, 33554467, 67108879
+ 3, 5, 11, 17, 37, 67, 109, 131, 163, 257, 367, 521, 823, 1031,
+ 1237, 1447, 2053, 2389, 2777, 3323, 4099, 5059, 6247, 7001, 8209, 10993,
+ 14057, 16411, 19181, 21089, 25033, 32771, 40009, 47431, 65537, 106721,
+ 131101, 262147, 360163, 524309, 810343, 1048583, 2097169, 4194319,
+ 6153409, 8388617, 13845163, 16777259, 33554467, 67108879
};
/* Find appropriate size for the hash table. The size will be a prime. */
bool silc_hash_table_find(SilcHashTable ht, void *key,
void **ret_key, void **ret_context)
{
- SilcHashTableEntry *entry;
-
- entry = silc_hash_table_find_internal_simple(ht, key, ht->hash,
- ht->hash_user_context,
- ht->compare,
- ht->compare_user_context);
- if (*entry == NULL)
- return FALSE;
-
- if (ret_key)
- *ret_key = (*entry)->key;
- if (ret_context)
- *ret_context = (*entry)->context;
-
- return TRUE;
+ return silc_hash_table_find_ext(ht, key, ret_key, ret_context,
+ NULL, NULL, NULL, NULL);
}
/* Same as above but with specified hash and comparison functions. */
bool silc_hash_table_find_by_context(SilcHashTable ht, void *key,
void *context, void **ret_key)
+{
+ return silc_hash_table_find_by_context_ext(ht, key, context, ret_key,
+ NULL, NULL, NULL, NULL);
+}
+
+/* Same as above but with specified hash and comparison functions. */
+
+bool silc_hash_table_find_by_context_ext(SilcHashTable ht, void *key,
+ void *context, void **ret_key,
+ SilcHashFunction hash,
+ void *hash_user_context,
+ SilcHashCompare compare,
+ void *compare_user_context)
{
SilcHashTableEntry *entry;
entry = silc_hash_table_find_internal_context(ht, key, context, NULL,
- ht->hash,
+ hash ? hash : ht->hash,
+ hash_user_context ?
+ hash_user_context :
ht->hash_user_context,
+ compare ? compare :
ht->compare,
+ compare_user_context ?
+ compare_user_context :
ht->compare_user_context);
if (!entry || !(*entry))
return FALSE;