nginx的hash

program2050 2012-07-20 11:40:27
nginx(1.0.4版本)中的,通过这个宏计算hash
#define ngx_hash(key, c) ((ngx_uint_t) key * 31 + c)

我很好奇,这样数据溢出了,怎么办?

还是nginx里面不关心,只要最终有桶(bucket)能容纳这个key-value就可以啦?

初学nginx源码,望高手赐教。
...全文
57 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2012-07-20
  • 打赏
  • 举报
回复
为什么就会溢出呢, key的范围是什么.
qq120848369 2012-07-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

C/C++ code

ngx_uint_t
ngx_hash_key_lc(u_char *data, size_t len)
{
ngx_uint_t i, key;

key = 0;

for (i = 0; i < len; i++) {
key = ngx_hash(key, ngx_tolower(data[i]));
}

……
[/Quote]

是这样。
program2050 2012-07-20
  • 打赏
  • 举报
回复
对了,为什么要乘上31呢。

有什么原理吗?
program2050 2012-07-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

ngx_hash只是求个hash值,溢出不溢出无所谓啦
[/Quote]

我也是这么理解的。呵呵。
root_jli 2012-07-20
  • 打赏
  • 举报
回复
ngx_hash只是求个hash值,溢出不溢出无所谓啦
program2050 2012-07-20
  • 打赏
  • 举报
回复

ngx_uint_t
ngx_hash_key_lc(u_char *data, size_t len)
{
ngx_uint_t i, key;

key = 0;

for (i = 0; i < len; i++) {
key = ngx_hash(key, ngx_tolower(data[i]));
}

return key;
}


呵呵,ngx_uint_t,其实应该就是unsigned long int。
如果data是一长串字符"1111111111111111111111111111111111111111...........".
通过这个不断的乘上31,积肯定会非常大,应该会溢出吧。。。。

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧