From 8f497e06487d56573d17379183249fe02500ca2f Mon Sep 17 00:00:00 2001 From: ningerso Date: Tue, 16 Jan 2007 01:27:01 +0000 Subject: [PATCH] Add basic stat output to hash for testing. Expose hash output functions for ecore_string. Move mask calculation outside inner loop for ecore_str_hash. SVN revision: 28006 --- legacy/ecore/src/lib/ecore/Ecore_Data.h | 3 +++ legacy/ecore/src/lib/ecore/ecore_hash.c | 27 ++++++++++++++++++++++ legacy/ecore/src/lib/ecore/ecore_strings.c | 12 ++++++++++ legacy/ecore/src/lib/ecore/ecore_value.c | 6 +++-- 4 files changed, 46 insertions(+), 2 deletions(-) diff --git a/legacy/ecore/src/lib/ecore/Ecore_Data.h b/legacy/ecore/src/lib/ecore/Ecore_Data.h index 80af8208d4..61f5c7fc8d 100644 --- a/legacy/ecore/src/lib/ecore/Ecore_Data.h +++ b/legacy/ecore/src/lib/ecore/Ecore_Data.h @@ -248,6 +248,7 @@ extern "C" { EAPI int ecore_hash_set(Ecore_Hash *hash, void *key, void *value); EAPI void *ecore_hash_remove(Ecore_Hash *hash, const void *key); EAPI void ecore_hash_dump_graph(Ecore_Hash *hash); + EAPI void ecore_hash_dump_stats(Ecore_Hash *hash); typedef struct _ecore_path_group Ecore_Path_Group; @@ -360,6 +361,8 @@ extern "C" { EAPI void ecore_string_shutdown(void); EAPI const char *ecore_string_instance(const char *string); EAPI void ecore_string_release(const char *string); + EAPI void ecore_string_hash_dump_graph(); + EAPI void ecore_string_hash_dump_stats(); typedef struct _Ecore_Tree_Node Ecore_Tree_Node; diff --git a/legacy/ecore/src/lib/ecore/ecore_hash.c b/legacy/ecore/src/lib/ecore/ecore_hash.c index e6a0f12c14..f73a59a349 100644 --- a/legacy/ecore/src/lib/ecore/ecore_hash.c +++ b/legacy/ecore/src/lib/ecore/ecore_hash.c @@ -318,6 +318,33 @@ ecore_hash_dump_graph(Ecore_Hash *hash) printf("%d\t0\n", i); } +/** + * Prints the distribution of the given hash table for graphing. + * @param hash The given hash table. + */ +EAPI void +ecore_hash_dump_stats(Ecore_Hash *hash) +{ + unsigned int i; + double variance, sum_n_2 = 0, sum_n = 0; + + for (i = 0; i < ecore_prime_table[hash->size]; i++) + { + if (hash->buckets[i]) + { + int n = 0; + Ecore_Hash_Node *node; + for (node = hash->buckets[i]; node; node = node->next) + n++; + sum_n_2 += ((double)n * (double)n); + sum_n += (double)n; + } + } + variance = (sum_n_2 - ((sum_n * sum_n) / (double)i)) / (double)i; + printf("Average length: %f\n\tvariance^2: %f\n", (sum_n / (double)i), + variance); +} + static int _ecore_hash_bucket_destroy(Ecore_Hash_Node *list, Ecore_Free_Cb keyd, Ecore_Free_Cb valued) { diff --git a/legacy/ecore/src/lib/ecore/ecore_strings.c b/legacy/ecore/src/lib/ecore/ecore_strings.c index 79f186b3ab..7d891a88b1 100644 --- a/legacy/ecore/src/lib/ecore/ecore_strings.c +++ b/legacy/ecore/src/lib/ecore/ecore_strings.c @@ -102,6 +102,18 @@ ecore_string_release(const char *string) } } +EAPI void +ecore_string_hash_dump_graph() +{ + ecore_hash_dump_graph(ecore_strings); +} + +EAPI void +ecore_string_hash_dump_stats() +{ + ecore_hash_dump_stats(ecore_strings); +} + /** * Shutdown the ecore string internal structures */ diff --git a/legacy/ecore/src/lib/ecore/ecore_value.c b/legacy/ecore/src/lib/ecore/ecore_value.c index de02675c8c..d58715dcac 100644 --- a/legacy/ecore/src/lib/ecore/ecore_value.c +++ b/legacy/ecore/src/lib/ecore/ecore_value.c @@ -67,16 +67,18 @@ EAPI unsigned int ecore_str_hash(const void *key) { int i; + unsigned int mask; unsigned int value = 0; const char *k = key; if (!k) return 0; + mask = (sizeof(unsigned int) * 8) - 1; + for (i = 0; k[i] != '\0'; i++) { - value ^= ((unsigned int) k[i] << ((i * 5) % - (sizeof(unsigned int) * 8))); + value ^= ((unsigned int) k[i] << ((i * 5) & mask)); } return value;