File: MurmurHashNeutral2.h

package info (click to toggle)
libclass-xsaccessor-perl 1.13-1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 520 kB
  • sloc: perl: 841; ansic: 359; makefile: 6
file content (56 lines) | stat: -rw-r--r-- 1,069 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/*-----------------------------------------------------------------------------
 * MurmurHashNeutral2, by Austin Appleby
 *
 * Same as MurmurHash2, but endian- and alignment-neutral.
 * Half the speed though, alas.
 */
 /* Code released into the public domain. */
 /* C-ification and adaption to perl.h by Steffen Mueller 2009-11-03 */

#include "perl.h"

#ifndef _MurmurHashNeutral2_h_
#define _MurmurHashNeutral2_h_

U32 CXSA_MurmurHashNeutral2(const void* key, STRLEN len, U32 _seed) {
  const unsigned int m = 0x5bd1e995;
  const int r = 24;

  unsigned int h = _seed ^ len;

  const unsigned char* data = (const unsigned char*)key;

  while(len >= 4) {
    unsigned int k;

    k  = data[0];
    k |= data[1] << 8;
    k |= data[2] << 16;
    k |= data[3] << 24;

    k *= m; 
    k ^= k >> r; 
    k *= m;

    h *= m;
    h ^= k;

    data += 4;
    len -= 4;
  }
  
  switch(len)  {
  case 3: h ^= data[2] << 16;
  case 2: h ^= data[1] << 8;
  case 1: h ^= data[0];
          h *= m;
  };

  h ^= h >> 13;
  h *= m;
  h ^= h >> 15;

  return (U32)h;
} 

#endif