码迷,mamicode.com
首页 > 数据库 > 详细

【LevelDB源码阅读】Hash

时间:2020-06-09 14:36:16      阅读:86      评论:0      收藏:0      [点我收藏+]

标签:eve   real   decode   init   ota   一个   label   高效   similar   

是什么

是一种哈希函数,采用的是MurMurHash的一种变体,是一种高效低碰撞的非加密型哈希函数。

为什么要用

  • 具有较高的平衡性与低碰撞率

学到什么

  • 对于大块数据,可以分多个小的部分进行哈希计算

源码分析

主要就一个hash接口

uint32_t Hash(const char *data, size_t n, uint32_t seed);

具体实现如下:

uint32_t Hash(const char *data, size_t n, uint32_t seed) {
  // Similar to murmur hash
  const uint32_t m = 0xc6a4a793;
  const uint32_t r = 24;
  const char *limit = data + n;
  uint32_t h = seed ^ (n * m);

  // Pick up four bytes at a time
  while (data + 4 <= limit) {
    uint32_t w = DecodeFixed32(data);
    data += 4;
    h += w;
    h *= m;
    h ^= (h >> 16);
  }

  // Pick up remaining bytes
  switch (limit - data) {
    case 3:
      h += static_cast<uint8_t>(data[2]) << 16;
      FALLTHROUGH_INTENDED;
    case 2:
      h += static_cast<uint8_t>(data[1]) << 8;
      FALLTHROUGH_INTENDED;
    case 1:
      h += static_cast<uint8_t>(data[0]);
      h *= m;
      h ^= (h >> r);
      break;
  }
  return h;
}

其中FALLTHROUGH_INTENDED定义如下:

// The FALLTHROUGH_INTENDED macro can be used to annotate implicit fall-through
// between switch labels. The real definition should be provided externally.
// This one is a fallback version for unsupported compilers.
#ifndef FALLTHROUGH_INTENDED
#define FALLTHROUGH_INTENDED   do {                         } while (0)
#endif

【LevelDB源码阅读】Hash

标签:eve   real   decode   init   ota   一个   label   高效   similar   

原文地址:https://www.cnblogs.com/galaxy-hao/p/13072161.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!