diff options
-rw-r--r-- | common/collection/collection.c | 57 | ||||
-rw-r--r-- | common/collection/collection.h | 10 | ||||
-rw-r--r-- | common/collection/collection_ut.c | 21 |
3 files changed, 71 insertions, 17 deletions
diff --git a/common/collection/collection.c b/common/collection/collection.c index e8752375..bccb50df 100644 --- a/common/collection/collection.c +++ b/common/collection/collection.c @@ -241,19 +241,12 @@ static int col_allocate_item(struct collection_item **ci, const char *property, return ENOMEM; } - item->phash = FNV1a_base; - item->property_len = 0; - - while (property[item->property_len] != 0) { - item->phash = item->phash ^ toupper(property[item->property_len]); - item->phash *= FNV1a_prime; - item->property_len++; - } - + item->phash = col_make_hash(property, &(item->property_len)); TRACE_INFO_NUMBER("Item hash", item->phash); TRACE_INFO_NUMBER("Item property length", item->property_len); TRACE_INFO_NUMBER("Item property strlen", strlen(item->property)); + /* Deal with data */ item->data = malloc(length); if (item->data == NULL) { @@ -2873,14 +2866,10 @@ int col_modify_item(struct collection_item *item, } /* Update property length and hash if we rename the property */ - item->phash = FNV1a_base; - item->property_len = 0; - - while (property[item->property_len] != 0) { - item->phash = item->phash ^ toupper(property[item->property_len]); - item->phash *= FNV1a_prime; - item->property_len++; - } + item->phash = col_make_hash(property, &(item->property_len)); + TRACE_INFO_NUMBER("Item hash", item->phash); + TRACE_INFO_NUMBER("Item property length", item->property_len); + TRACE_INFO_NUMBER("Item property strlen", strlen(item->property)); } @@ -3343,3 +3332,37 @@ void *col_get_item_data(struct collection_item *ci) { return ci->data; } + +/* Get hash */ +uint64_t col_get_item_hash(struct collection_item *ci) +{ + return ci->phash; +} + +/* Calculates hash of the string using internal hashing + * algorithm. Populates "length" with length + * of the string not counting 0. + * Length argument can be NULL. + */ +uint64_t col_make_hash(const char *string, int *length) +{ + uint64_t hash = 0; + int str_len = 0; + + TRACE_FLOW_STRING("col_make_hash called for string:", string); + + if (string) { + hash = FNV1a_base; + while (string[str_len] != 0) { + hash = hash ^ toupper(string[str_len]); + hash *= FNV1a_prime; + str_len++; + } + } + + if (length) *length = str_len; + + TRACE_FLOW_NUMBER("col_make_hash returning hash:", hash); + + return hash; +} diff --git a/common/collection/collection.h b/common/collection/collection.h index 1ff038e1..dc59ea2f 100644 --- a/common/collection/collection.h +++ b/common/collection/collection.h @@ -22,6 +22,8 @@ #ifndef COLLECTION_H #define COLLECTION_H +#include <stdint.h> + #ifndef EOK #define EOK 0 #endif @@ -490,6 +492,14 @@ const char *col_get_item_property(struct collection_item *ci, int *property_len) int col_get_item_type(struct collection_item *ci); int col_get_item_length(struct collection_item *ci); void *col_get_item_data(struct collection_item *ci); +uint64_t col_get_item_hash(struct collection_item *ci); + +/* Calculates hash of the string using internal hashing + * algorithm. Populates "length" with length + * of the string not counting 0. + * Length argument can be NULL. + */ +uint64_t col_make_hash(const char *string, int *length); /* If you want to modify the item that you got as a result of iterating through collection * or by calling col_get_item(). If you want to rename item provide a new name in the property diff --git a/common/collection/collection_ut.c b/common/collection/collection_ut.c index f1ec905a..050c6ef1 100644 --- a/common/collection/collection_ut.c +++ b/common/collection/collection_ut.c @@ -592,6 +592,7 @@ int iterator_test(void) char binary_dump[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }; int depth = 0; int idepth = 0; + int len = 0; printf("\n\n==== ITERATOR TEST ====\n\n"); @@ -767,6 +768,26 @@ int iterator_test(void) col_destroy_collection(peer); return error; } + + printf("Item name: %s\n", col_get_item_property(item, NULL)); + printf("Item hash: %lu\n", (unsigned long int)col_get_item_hash(item)); + error = col_modify_item_property(item, "new_name"); + if (error) { + printf("We expected success but got error %d\n", error); + col_unbind_iterator(iterator); + col_destroy_collection(peer); + return error; + } + len = 0; + printf("Item name: %s\n", col_get_item_property(item, &len)); + printf("Item hash: %lu\n", (unsigned long int)col_get_item_hash(item)); + printf("Item length: %d\n", len); + + len = 0; + printf("String name: %s\n", "new_name"); + printf("String hash: %lu\n", (unsigned long int)col_make_hash("new_name", &len)); + printf("String length: %d\n", len); + } } while(1); |