Annotation of embedaddon/php/ext/hash/hash_fnv.c, revision 1.1

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: Michael Maclean <mgdm@php.net>                               |
        !            16:   +----------------------------------------------------------------------+
        !            17: */
        !            18: 
        !            19: /* $Id$ */
        !            20: 
        !            21: /*  Based on the public domain algorithm found at
        !            22:        http://www.isthe.com/chongo/tech/comp/fnv/index.html */
        !            23: 
        !            24: #include "php_hash.h"
        !            25: #include "php_hash_fnv.h"
        !            26: 
        !            27: const php_hash_ops php_hash_fnv132_ops = {
        !            28:        (php_hash_init_func_t) PHP_FNV132Init,
        !            29:        (php_hash_update_func_t) PHP_FNV132Update,
        !            30:        (php_hash_final_func_t) PHP_FNV132Final,
        !            31:        (php_hash_copy_func_t) php_hash_copy,
        !            32:        4,
        !            33:        4,
        !            34:        sizeof(PHP_FNV132_CTX)
        !            35: };
        !            36: 
        !            37:        const php_hash_ops php_hash_fnv1a32_ops = {
        !            38:        (php_hash_init_func_t) PHP_FNV132Init,
        !            39:        (php_hash_update_func_t) PHP_FNV1a32Update,
        !            40:        (php_hash_final_func_t) PHP_FNV132Final, 
        !            41:        (php_hash_copy_func_t) php_hash_copy,
        !            42:        4,
        !            43:        4,
        !            44:        sizeof(PHP_FNV132_CTX)
        !            45: };
        !            46: 
        !            47: const php_hash_ops php_hash_fnv164_ops = {
        !            48:        (php_hash_init_func_t) PHP_FNV164Init,
        !            49:        (php_hash_update_func_t) PHP_FNV164Update,
        !            50:        (php_hash_final_func_t) PHP_FNV164Final, 
        !            51:        (php_hash_copy_func_t) php_hash_copy,
        !            52:        8,
        !            53:        4,
        !            54:        sizeof(PHP_FNV164_CTX)
        !            55: };
        !            56: 
        !            57: const php_hash_ops php_hash_fnv1a64_ops = {
        !            58:        (php_hash_init_func_t) PHP_FNV164Init,
        !            59:        (php_hash_update_func_t) PHP_FNV1a64Update,
        !            60:        (php_hash_final_func_t) PHP_FNV164Final,  
        !            61:        (php_hash_copy_func_t) php_hash_copy,
        !            62:        8,
        !            63:        4,
        !            64:        sizeof(PHP_FNV164_CTX)
        !            65: };
        !            66: 
        !            67: /* {{{ PHP_FNV132Init
        !            68:  * 32-bit FNV-1 hash initialisation
        !            69:  */
        !            70: PHP_HASH_API void PHP_FNV132Init(PHP_FNV132_CTX *context)
        !            71: {
        !            72:        context->state = PHP_FNV1_32_INIT;
        !            73: }
        !            74: /* }}} */
        !            75: 
        !            76: PHP_HASH_API void PHP_FNV132Update(PHP_FNV132_CTX *context, const unsigned char *input,
        !            77:                unsigned int inputLen)
        !            78: {
        !            79:        context->state = fnv_32_buf((void *)input, inputLen, context->state, 0);
        !            80: }
        !            81: 
        !            82: PHP_HASH_API void PHP_FNV1a32Update(PHP_FNV132_CTX *context, const unsigned char *input,
        !            83:                unsigned int inputLen)
        !            84: {
        !            85:        context->state = fnv_32_buf((void *)input, inputLen, context->state, 1);
        !            86: }
        !            87: 
        !            88: PHP_HASH_API void PHP_FNV132Final(unsigned char digest[4], PHP_FNV132_CTX * context)
        !            89: {
        !            90: #ifdef WORDS_BIGENDIAN
        !            91:        memcpy(digest, &context->state, 4);
        !            92: #else
        !            93:        int i = 0;
        !            94:        unsigned char *c = (unsigned char *) &context->state;
        !            95: 
        !            96:        for (i = 0; i < 4; i++) {
        !            97:                digest[i] = c[3 - i];
        !            98:        }
        !            99: #endif
        !           100: }
        !           101: 
        !           102: /* {{{ PHP_FNV164Init
        !           103:  * 64-bit FNV-1 hash initialisation
        !           104:  */
        !           105: PHP_HASH_API void PHP_FNV164Init(PHP_FNV164_CTX *context)
        !           106: {
        !           107:        context->state = PHP_FNV1_64_INIT;
        !           108: }
        !           109: /* }}} */
        !           110: 
        !           111: PHP_HASH_API void PHP_FNV164Update(PHP_FNV164_CTX *context, const unsigned char *input,
        !           112:                unsigned int inputLen)
        !           113: {
        !           114:        context->state = fnv_64_buf((void *)input, inputLen, context->state, 0);
        !           115: }
        !           116: 
        !           117: PHP_HASH_API void PHP_FNV1a64Update(PHP_FNV164_CTX *context, const unsigned char *input,
        !           118:                unsigned int inputLen)
        !           119: {
        !           120:        context->state = fnv_64_buf((void *)input, inputLen, context->state, 1);
        !           121: }
        !           122: 
        !           123: PHP_HASH_API void PHP_FNV164Final(unsigned char digest[8], PHP_FNV164_CTX * context)
        !           124: {
        !           125: #ifdef WORDS_BIGENDIAN
        !           126:        memcpy(digest, &context->state, 8);
        !           127: #else
        !           128:        int i = 0;
        !           129:        unsigned char *c = (unsigned char *) &context->state;
        !           130: 
        !           131:        for (i = 0; i < 8; i++) {
        !           132:                digest[i] = c[7 - i];
        !           133:        }
        !           134: #endif
        !           135: }
        !           136: 
        !           137: 
        !           138: /*
        !           139:  * fnv_32_buf - perform a 32 bit Fowler/Noll/Vo hash on a buffer
        !           140:  *
        !           141:  * input:
        !           142:  *  buf - start of buffer to hash
        !           143:  *  len - length of buffer in octets
        !           144:  *  hval       - previous hash value or 0 if first call
        !           145:  *  alternate - if > 0 use the alternate version
        !           146:  *
        !           147:  * returns:
        !           148:  *  32 bit hash as a static hash type
        !           149:  */
        !           150: static php_hash_uint32
        !           151: fnv_32_buf(void *buf, size_t len, php_hash_uint32 hval, int alternate)
        !           152: {
        !           153:        unsigned char *bp = (unsigned char *)buf;   /* start of buffer */
        !           154:        unsigned char *be = bp + len;      /* beyond end of buffer */
        !           155: 
        !           156:        /*
        !           157:         * FNV-1 hash each octet in the buffer
        !           158:         */
        !           159:        while (bp < be) {
        !           160: 
        !           161:                if (alternate == 0) {
        !           162:                        /* multiply by the 32 bit FNV magic prime mod 2^32 */
        !           163:                        hval *= PHP_FNV_32_PRIME;
        !           164: 
        !           165:                        /* xor the bottom with the current octet */
        !           166:                        hval ^= (php_hash_uint32)*bp++;
        !           167:                } else {
        !           168:                        /* xor the bottom with the current octet */
        !           169:                        hval ^= (php_hash_uint32)*bp++;
        !           170: 
        !           171:                        /* multiply by the 32 bit FNV magic prime mod 2^32 */
        !           172:                        hval *= PHP_FNV_32_PRIME;
        !           173:                }
        !           174:        }
        !           175: 
        !           176:        /* return our new hash value */
        !           177:        return hval;
        !           178: }
        !           179: 
        !           180: /*
        !           181:  * fnv_64_buf - perform a 64 bit Fowler/Noll/Vo hash on a buffer
        !           182:  *
        !           183:  * input:
        !           184:  *  buf - start of buffer to hash
        !           185:  *  len - length of buffer in octets
        !           186:  *  hval       - previous hash value or 0 if first call
        !           187:  *  alternate - if > 0 use the alternate version
        !           188:  *
        !           189:  * returns:
        !           190:  *  64 bit hash as a static hash type
        !           191:  */
        !           192: static php_hash_uint64
        !           193: fnv_64_buf(void *buf, size_t len, php_hash_uint64 hval, int alternate)
        !           194: {
        !           195:        unsigned char *bp = (unsigned char *)buf;   /* start of buffer */
        !           196:        unsigned char *be = bp + len;      /* beyond end of buffer */
        !           197: 
        !           198:        /*
        !           199:         * FNV-1 hash each octet of the buffer
        !           200:         */
        !           201:        while (bp < be) {
        !           202: 
        !           203:                if (alternate == 0) {
        !           204:                        /* multiply by the 64 bit FNV magic prime mod 2^64 */
        !           205:                        hval *= PHP_FNV_64_PRIME;
        !           206: 
        !           207:                        /* xor the bottom with the current octet */
        !           208:                        hval ^= (php_hash_uint64)*bp++;
        !           209:                 } else {
        !           210:                        /* xor the bottom with the current octet */
        !           211:                        hval ^= (php_hash_uint64)*bp++;
        !           212: 
        !           213:                        /* multiply by the 64 bit FNV magic prime mod 2^64 */
        !           214:                        hval *= PHP_FNV_64_PRIME;
        !           215:                 }
        !           216:        }
        !           217: 
        !           218:        /* return our new hash value */
        !           219:        return hval;
        !           220: }
        !           221: 
        !           222: /*
        !           223:  * Local variables:
        !           224:  * tab-width: 4
        !           225:  * c-basic-offset: 4
        !           226:  * End:
        !           227:  * vim600: noet sw=4 ts=4 fdm=marker
        !           228:  * vim<600: noet sw=4 ts=4
        !           229:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>