diff options
author | Dmitri Pal <dpal@redhat.com> | 2009-09-10 18:02:51 -0400 |
---|---|---|
committer | Stephen Gallagher <sgallagh@redhat.com> | 2009-09-11 12:14:27 -0400 |
commit | 47c2cd65746a20798c546a68038e9b6e5dcad9cf (patch) | |
tree | 99d648ba0c246453971f1d708f7b28a09587f761 /collection/collection.c | |
parent | 6b31b72b11cb564b5be2519d66164b6ff8f6c408 (diff) | |
download | ding-libs-47c2cd65746a20798c546a68038e9b6e5dcad9cf.tar.gz ding-libs-47c2cd65746a20798c546a68038e9b6e5dcad9cf.tar.xz ding-libs-47c2cd65746a20798c546a68038e9b6e5dcad9cf.zip |
COLLECTION Functions to deal with hash
The hashing logic was internal to the collection item.
But if someone wants to effectively deal with
the items and compare the property to a string
he should compare hashes first. But it was not possible
without the provided functions. As a result some
of the ELAPI modules had to take advantage of
knowledge of the item structure. This is bad.
So this patch lays foundation for refactoring
of the ELAPI code that was using internals of the item
directly (file_util.c mostly).
Also patch adds a unit test that was required for
testing new functionality and for ticket #83
Diffstat (limited to 'collection/collection.c')
-rw-r--r-- | collection/collection.c | 57 |
1 files changed, 40 insertions, 17 deletions
diff --git a/collection/collection.c b/collection/collection.c index e875237..bccb50d 100644 --- a/collection/collection.c +++ b/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; +} |