summaryrefslogtreecommitdiff
path: root/linkhash.h
diff options
context:
space:
mode:
authorEric Haszlakiewicz <erh+git@nimenees.com>2015-09-28 22:25:29 -0400
committerEric Haszlakiewicz <erh+git@nimenees.com>2015-09-28 22:25:29 -0400
commit12916e229c769da4929f6df7f038ab51cf0cb067 (patch)
tree1aa6900534e192ae367458a089d110b0be2f6efa /linkhash.h
parent1757a31750134577faf80b91d0cf6f98d3918e6c (diff)
parentc4f8cc34df91715d008166e4748c5f32ee894698 (diff)
downloadjson-c-12916e229c769da4929f6df7f038ab51cf0cb067.tar.gz
Merge pull request #196 from rgerhards/improve-performance
Performance improvements
Diffstat (limited to 'linkhash.h')
-rw-r--r--linkhash.h109
1 files changed, 65 insertions, 44 deletions
diff --git a/linkhash.h b/linkhash.h
index 280d64b..c037fef 100644
--- a/linkhash.h
+++ b/linkhash.h
@@ -41,6 +41,23 @@ extern "C" {
*/
#define LH_FREED (void*)-2
+/**
+ * default string hash function
+ */
+#define JSON_C_STR_HASH_DFLT 0
+
+/**
+ * perl-like string hash function
+ */
+#define JSON_C_STR_HASH_PERLLIKE 1
+
+/**
+ * This function sets the hash function to be used for strings.
+ * Must be one of the JSON_C_STR_HASH_* values.
+ * @returns 0 - ok, -1 if parameter was invalid
+ */
+int json_global_set_string_hash(const int h);
+
struct lh_entry;
/**
@@ -64,6 +81,7 @@ struct lh_entry {
* The key.
*/
void *k;
+ int k_is_constant;
/**
* The value.
*/
@@ -93,36 +111,6 @@ struct lh_table {
int count;
/**
- * Number of collisions.
- */
- int collisions;
-
- /**
- * Number of resizes.
- */
- int resizes;
-
- /**
- * Number of lookups.
- */
- int lookups;
-
- /**
- * Number of inserts.
- */
- int inserts;
-
- /**
- * Number of deletes.
- */
- int deletes;
-
- /**
- * Name of the hash table.
- */
- const char *name;
-
- /**
* The first entry.
*/
struct lh_entry *head;
@@ -144,16 +132,6 @@ struct lh_table {
/**
- * Pre-defined hash and equality functions
- */
-extern unsigned long lh_ptr_hash(const void *k);
-extern int lh_ptr_equal(const void *k1, const void *k2);
-
-extern unsigned long lh_char_hash(const void *k);
-extern int lh_char_equal(const void *k1, const void *k2);
-
-
-/**
* Convenience list iterator.
*/
#define lh_foreach(table, entry) \
@@ -171,7 +149,6 @@ for(entry = table->head; entry && ((tmp = entry->next) || 1); entry = tmp)
* Create a new linkhash table.
* @param size initial table size. The table is automatically resized
* although this incurs a performance penalty.
- * @param name the table name.
* @param free_fn callback function used to free memory for entries
* when lh_table_free or lh_table_delete is called.
* If NULL is provided, then memory for keys and values
@@ -184,7 +161,7 @@ for(entry = table->head; entry && ((tmp = entry->next) || 1); entry = tmp)
* and C strings respectively.
* @return a pointer onto the linkhash table.
*/
-extern struct lh_table* lh_table_new(int size, const char *name,
+extern struct lh_table* lh_table_new(int size,
lh_entry_free_fn *free_fn,
lh_hash_fn *hash_fn,
lh_equal_fn *equal_fn);
@@ -197,7 +174,7 @@ extern struct lh_table* lh_table_new(int size, const char *name,
* @param free_fn callback function used to free memory for entries.
* @return a pointer onto the linkhash table.
*/
-extern struct lh_table* lh_kchar_table_new(int size, const char *name,
+extern struct lh_table* lh_kchar_table_new(int size,
lh_entry_free_fn *free_fn);
@@ -209,7 +186,7 @@ extern struct lh_table* lh_kchar_table_new(int size, const char *name,
* @param free_fn callback function used to free memory for entries.
* @return a pointer onto the linkhash table.
*/
-extern struct lh_table* lh_kptr_table_new(int size, const char *name,
+extern struct lh_table* lh_kptr_table_new(int size,
lh_entry_free_fn *free_fn);
@@ -232,6 +209,21 @@ extern int lh_table_insert(struct lh_table *t, void *k, const void *v);
/**
+ * Insert a record into the table. This one accepts the key's hash in additon
+ * to the key. This is an exension to support functions that need to calculate
+ * the hash several times and allows them to do it just once and then pass
+ * in the hash to all utility functions. Depending on use case, this can be a
+ * very considerate performance improvement.
+ * @param t the table to insert into.
+ * @param k a pointer to the key to insert.
+ * @param v a pointer to the value to insert.
+ * @param h hash value of the key to insert
+ * @param opts opts, a subset of JSON_OBJECT_ADD_* flags is supported
+ */
+extern int lh_table_insert_w_hash(struct lh_table *t, void *k, const void *v, const unsigned long h, const unsigned opts);
+
+
+/**
* Lookup a record into the table.
* @param t the table to lookup
* @param k a pointer to the key to lookup
@@ -240,6 +232,19 @@ extern int lh_table_insert(struct lh_table *t, void *k, const void *v);
extern struct lh_entry* lh_table_lookup_entry(struct lh_table *t, const void *k);
/**
+ * Lookup a record into the table. This one accepts the key's hash in additon
+ * to the key. This is an exension to support functions that need to calculate
+ * the hash several times and allows them to do it just once and then pass
+ * in the hash to all utility functions. Depending on use case, this can be a
+ * very considerate performance improvement.
+ * @param t the table to lookup
+ * @param k a pointer to the key to lookup
+ * @param h hash value of the key to lookup
+ * @return a pointer to the record structure of the value or NULL if it does not exist.
+ */
+extern struct lh_entry* lh_table_lookup_entry_w_hash(struct lh_table *t, const void *k, const unsigned long h);
+
+/**
* Lookup a record into the table
* @param t the table to lookup
* @param k a pointer to the key to lookup
@@ -285,6 +290,22 @@ extern int lh_table_length(struct lh_table *t);
void lh_abort(const char *msg, ...);
void lh_table_resize(struct lh_table *t, int new_size);
+
+/**
+ * Calculate the hash of a key for a given table.
+ * This is an exension to support functions that need to calculate
+ * the hash several times and allows them to do it just once and then pass
+ * in the hash to all utility functions. Depending on use case, this can be a
+ * very considerate performance improvement.
+ * @param t the table (used to obtain hash function)
+ * @param k a pointer to the key to lookup
+ * @return the key's hash
+ */
+static inline unsigned long lh_get_hash(const struct lh_table *t, const void *k)
+{
+ return t->hash_fn(k);
+}
+
#ifdef __cplusplus
}
#endif