root/ext/hash/hash_joaat.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. PHP_JOAATInit
  2. PHP_JOAATUpdate
  3. PHP_JOAATFinal
  4. joaat_buf

   1 /*
   2   +----------------------------------------------------------------------+
   3   | PHP Version 7                                                        |
   4   +----------------------------------------------------------------------+
   5   | Copyright (c) 1997-2016 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  */

/* [<][>][^][v][top][bottom][index][help] */