1 /* 2 * Copyright (c) 2004-2007 The University of Tennessee and The University 3 * of Tennessee Research Foundation. All rights 4 * reserved. 5 * $COPYRIGHT$ 6 * 7 * Additional copyrights may follow 8 * 9 * $HEADER$ 10 */ 11 12 /** @file 13 * 14 * Simple macros to quickly compute a hash value from a string. 15 * 16 */ 17 18 #ifndef OPAL_HASH_STRING_H 19 #define OPAL_HASH_STRING_H 20 21 /** 22 * Compute the hash value and the string length simultaneously 23 * 24 * @param str (IN) The string which will be parsed (char*) 25 * @param hash (OUT) Where the hash value will be stored (uint32_t) 26 * @param length (OUT) The computed length of the string (uint32_t) 27 */ 28 #define OPAL_HASH_STRLEN( str, hash, length ) \ 29 do { \ 30 register const char *_str = (str); \ 31 register uint32_t _hash = 0; \ 32 register uint32_t _len = 0; \ 33 \ 34 while( *_str ) { \ 35 _len++; \ 36 _hash += *_str++; \ 37 _hash += (_hash << 10); \ 38 _hash ^= (_hash >> 6); \ 39 } \ 40 \ 41 _hash += (_hash << 3); \ 42 _hash ^= (_hash >> 11); \ 43 (hash) = (_hash + (_hash << 15)); \ 44 (length) = _len; \ 45 } while(0) 46 47 /** 48 * Compute the hash value 49 * 50 * @param str (IN) The string which will be parsed (char*) 51 * @param hash (OUT) Where the hash value will be stored (uint32_t) 52 */ 53 #define OPAL_HASH_STR( str, hash ) \ 54 do { \ 55 register const char *_str = (str); \ 56 register uint32_t _hash = 0; \ 57 \ 58 while( *_str ) { \ 59 _hash += *_str++; \ 60 _hash += (_hash << 10); \ 61 _hash ^= (_hash >> 6); \ 62 } \ 63 \ 64 _hash += (_hash << 3); \ 65 _hash ^= (_hash >> 11); \ 66 (hash) = (_hash + (_hash << 15)); \ 67 } while(0) 68 69 #endif /* OPAL_HASH_STRING_H */ 70