Use the common djb2 hash function for OST pool lookup. This is used
for string-based hashing in other parts of the code. It doesn't make
sense to have a custom hash function just for OST pool lookup, since
there aren't expected to be a huge number of pools and there is no
expectation that one of these functions is better than the other.
Signed-off-by: Andreas Dilger <andreas.dilger@intel.com>
Change-Id: I501a42bc169243204dfc847c0388240fc2500c1e
Reviewed-on: http://review.whamcloud.com/10243
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: John L. Hammond <john.hammond@intel.com>
Reviewed-by: Dmitry Eremin <dmitry.eremin@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
/**
* Hash the pool name for use by the cfs_hash handlers.
*
/**
* Hash the pool name for use by the cfs_hash handlers.
*
- * hash function using a Rotating Hash algorithm
- * Knuth, D. The Art of Computer Programming,
- * Volume 3: Sorting and Searching,
- * Chapter 6.4.
- * Addison Wesley, 1973
+ * Use the standard DJB2 hash function for ASCII strings in Lustre.
*
* \param[in] hash_body hash structure where this key is embedded (unused)
* \param[in] key key to be hashed (in this case the pool name)
*
* \param[in] hash_body hash structure where this key is embedded (unused)
* \param[in] key key to be hashed (in this case the pool name)
*/
static __u32 pool_hashfn(cfs_hash_t *hash_body, const void *key, unsigned mask)
{
*/
static __u32 pool_hashfn(cfs_hash_t *hash_body, const void *key, unsigned mask)
{
- int i;
- __u32 result;
- char *poolname;
-
- result = 0;
- poolname = (char *)key;
- for (i = 0; i < LOV_MAXPOOLNAME; i++) {
- if (poolname[i] == '\0')
- break;
- result = (result << 4) ^ (result >> 28) ^ poolname[i];
- }
- return result % mask;
+ return cfs_hash_djb2_hash(key, strnlen(key, LOV_MAXPOOLNAME), mask);