Return to hash_joaat.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / ext / hash |
1.1 ! misho 1: /* ! 2: +----------------------------------------------------------------------+ ! 3: | PHP Version 5 | ! 4: +----------------------------------------------------------------------+ ! 5: | Copyright (c) 1997-2012 The PHP Group | ! 6: +----------------------------------------------------------------------+ ! 7: | This source file is subject to version 3.01 of the PHP license, | ! 8: | that is bundled with this package in the file LICENSE, and is | ! 9: | available through the world-wide-web at the following url: | ! 10: | http://www.php.net/license/3_01.txt | ! 11: | If you did not receive a copy of the PHP license and are unable to | ! 12: | obtain it through the world-wide-web, please send a note to | ! 13: | license@php.net so we can mail you a copy immediately. | ! 14: +----------------------------------------------------------------------+ ! 15: | Author: Martin Jansen <mj@php.net> | ! 16: +----------------------------------------------------------------------+ ! 17: */ ! 18: ! 19: /* $Id$ */ ! 20: ! 21: /* Implements Jenkins's one-at-a-time hashing algorithm as presented on ! 22: * http://www.burtleburtle.net/bob/hash/doobs.html. ! 23: */ ! 24: ! 25: #include "php_hash.h" ! 26: #include "php_hash_joaat.h" ! 27: ! 28: const php_hash_ops php_hash_joaat_ops = { ! 29: (php_hash_init_func_t) PHP_JOAATInit, ! 30: (php_hash_update_func_t) PHP_JOAATUpdate, ! 31: (php_hash_final_func_t) PHP_JOAATFinal, ! 32: (php_hash_copy_func_t) php_hash_copy, ! 33: 4, ! 34: 4, ! 35: sizeof(PHP_JOAAT_CTX) ! 36: }; ! 37: ! 38: PHP_HASH_API void PHP_JOAATInit(PHP_JOAAT_CTX *context) ! 39: { ! 40: context->state = 0; ! 41: } ! 42: ! 43: PHP_HASH_API void PHP_JOAATUpdate(PHP_JOAAT_CTX *context, const unsigned char *input, unsigned int inputLen) ! 44: { ! 45: context->state = joaat_buf((void *)input, inputLen, context->state); ! 46: } ! 47: ! 48: PHP_HASH_API void PHP_JOAATFinal(unsigned char digest[4], PHP_JOAAT_CTX * context) ! 49: { ! 50: #ifdef WORDS_BIGENDIAN ! 51: memcpy(digest, &context->state, 4); ! 52: #else ! 53: int i = 0; ! 54: unsigned char *c = (unsigned char *) &context->state; ! 55: ! 56: for (i = 0; i < 4; i++) { ! 57: digest[i] = c[3 - i]; ! 58: } ! 59: #endif ! 60: context->state = 0; ! 61: } ! 62: ! 63: /* ! 64: * joaat_buf - perform a Jenkins's one-at-a-time hash on a buffer ! 65: * ! 66: * input: ! 67: * buf - start of buffer to hash ! 68: * len - length of buffer in octets ! 69: * ! 70: * returns: ! 71: * 32 bit hash as a static hash type ! 72: */ ! 73: static php_hash_uint32 ! 74: joaat_buf(void *buf, size_t len, php_hash_uint32 hval) ! 75: { ! 76: size_t i; ! 77: unsigned char *input = (unsigned char *)buf; ! 78: ! 79: for (i = 0; i < len; i++) { ! 80: hval += input[i]; ! 81: hval += (hval << 10); ! 82: hval ^= (hval >> 6); ! 83: } ! 84: ! 85: hval += (hval << 3); ! 86: hval ^= (hval >> 11); ! 87: hval += (hval << 15); ! 88: ! 89: return hval; ! 90: } ! 91: ! 92: /* ! 93: * Local variables: ! 94: * tab-width: 4 ! 95: * c-basic-offset: 4 ! 96: * End: ! 97: * vim600: noet sw=4 ts=4 fdm=marker ! 98: * vim<600: noet sw=4 ts=4 ! 99: */