/*
 * Perl XS for the Digest::Murmur Module
 */

#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "ppport.h"
#include <string.h>
#include <stdint.h>

U32
murmur_hash(char *data, size_t len) {
  const uint32_t m  =  0x5bd1e995;
  const uint8_t r   =  16;
  uint32_t length   =  len;
  uint32_t h        =  length * m;

  while (length >= 4) {
    h += *(unsigned int *)data;
    h *= m;
    h ^= h >> r;
    data += 4;
    length -= 4;
  }

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

  h *= m;
  h ^= h >> 10;
  h *= m;
  h ^= h >> 17;

  return h;
}

MODULE = Digest::MurmurHash	PACKAGE = Digest::MurmurHash		

U32 murmur_hash(char *data, size_t length(data))