Nginx原始碼完全註釋(6)core/murmurhash
Nginx原始碼完全註釋(6)murmurhash
- 作者:柳大·Poechant(鍾超)
- 郵箱:zhongchao.ustc#gmail.com(# -> @)
- 部落格:Blog.CSDN.net/Poechant
- 日期:August 18th, 2012
MurmurHash2 was written by Austin Appleby, and is placed in the public domain. The author hereby disclaims copyright to this source code.
下面是摘自 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
-
轉載請註明來自柳大Poechant(鍾超Michael)的CSDN部落格:
鍾超Michael的部落格:Blog.CSDN.net/Poechant
鍾超Michael的微博:鍾超Michael的新浪微博
-
相關文章
- 原始碼完全註釋:socket select原始碼
- 《Linux核心完全註釋》學習筆記:2.7 Linux核心原始碼的目錄結構Linux筆記原始碼
- nginx編譯出現的問題ngx_murmurhash.ofailedNginx編譯AI
- Bootstrap的Model原始碼詳細註釋 (轉)boot原始碼
- HashMap原始碼(JDK1.8)-手動註釋HashMap原始碼JDK
- Vue2.0原始碼學習(6) - 元件註冊Vue原始碼元件
- Redux原始碼完全解讀Redux原始碼
- 從Python原始碼註釋,自動生成API文件Python原始碼API
- DialogFragment使用到原始碼完全解析Fragment原始碼
- Dubbo原始碼解析之服務釋出與註冊原始碼
- 前端筆記-vue v2.6.10原始碼註釋-nextTick前端筆記Vue原始碼
- bootstrap-modal.js學習筆記(原始碼註釋)bootJS筆記原始碼
- asp.net core 6 釋出dockerASP.NETDocker
- NGINX原始碼閱讀Nginx原始碼
- nginx原始碼安裝Nginx原始碼
- Nginx 原始碼安裝Nginx原始碼
- .net core 原始碼分析原始碼
- EF Core 原始碼分析原始碼
- CSS程式碼註釋CSS
- snownlp類庫(中文情感分析)原始碼註釋及使用原始碼
- .NET Core(.NET6)中gRPC註冊到ConsulRPC
- 【.Net Core】 使用 Nginx 釋出 .Net Core 3.1 專案至LInux(Centos7)。NginxLinuxCentOS
- macbook 原始碼安裝 nginxMac原始碼Nginx
- docker原始碼安裝NginxDocker原始碼Nginx
- .NET Core HttpClient原始碼探究HTTPclient原始碼
- .Net Core Configuration原始碼探究原始碼
- .NET Core Session原始碼探究Session原始碼
- Java 註解完全解析Java
- iOS 註釋方法大全 程式碼塊加快捷鍵註釋iOS
- 有趣的程式碼註釋
- 請停止程式碼註釋
- 以太坊原始碼分析(20)core-bloombits原始碼分析原始碼OOM
- 以太坊原始碼分析(24)core-state原始碼分析原始碼
- 以太坊原始碼分析(29)core-vm原始碼分析原始碼
- IMX6ULL連結指令碼註釋記錄 2020-11-21指令碼
- mybatis原始碼-註解sqlMyBatis原始碼SQL
- 推薦VSCode註釋翻譯外掛,方便快速閱讀原始碼VSCode原始碼
- Nginx原始碼研究之nginx限流模組詳解Nginx原始碼
- 原始碼安裝Nginx和PHP原始碼NginxPHP