zoukankan      html  css  js  c++  java
  • Nginx源码完全注释(6)core/murmurhash

    下面是摘自 Google Code 的 Murmurhash 开源项目主页上的 Murmurhash2,Nginx 就是采用的这个。

    
    uint32_t MurmurHash2 ( const void * key, int len, uint32_t seed )
    {
      // 'm' and 'r' are mixing constants generated offline.
      // They're not really 'magic', they just happen to work well.
    
      const uint32_t m = 0x5bd1e995;
      const int r = 24;
    
      // Initialize the hash to a 'random' value
    
      uint32_t h = seed ^ len;
    
      // Mix 4 bytes at a time into the hash
    
      const unsigned char * data = (const unsigned char *)key;
    
      while(len >= 4)
      {
        uint32_t k = *(uint32_t*)data;
    
        k *= m;
        k ^= k >> r;
        k *= m;
    
        h *= m;
        h ^= k;
    
        data += 4;
        len -= 4;
      }
    
      // Handle the last few bytes of the input array
    
      switch(len)
      {
      case 3: h ^= data[2] << 16;
      case 2: h ^= data[1] << 8;
      case 1: h ^= data[0];
          h *= m;
      };
    
      // Do a few final mixes of the hash to ensure the last few
      // bytes are well-incorporated.
    
      h ^= h >> 13;
      h *= m;
      h ^= h >> 15;
    
      return h;
    } 
    

    下面是 Nginx 中 Murmurhash 的源码,基本与上面无异。

    
    uint32_t
    ngx_murmur_hash2(u_char *data, size_t len)
    {
        uint32_t  h, k;
    
        h = 0 ^ len;
    
        while (len >= 4) {
            k  = data[0];
            k |= data[1] << 8;
            k |= data[2] << 16;
            k |= data[3] << 24;
    
            k *= 0x5bd1e995;
            k ^= k >> 24;
            k *= 0x5bd1e995;
    
            h *= 0x5bd1e995;
            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 *= 0x5bd1e995;
        }
    
        h ^= h >> 13;
        h *= 0x5bd1e995;
        h ^= h >> 15;
    
        return h;
    }
    

    Reference

    1. Murmurhash2
  • 相关阅读:
    linux软件安装与卸载
    杂项搜集整理
    AS3的反编译
    linux驱动杂项
    Android 匿名共享内存C++接口分析
    S3C2440 之SPI
    二叉树
    ajax简介
    SP2-0618: Cannot find the Session Identifier. Check PLUSTRACE role is enabled
    让 collabtive-11 支持中文
  • 原文地址:https://www.cnblogs.com/breg/p/4043588.html
Copyright © 2011-2022 走看看