hotpower 前辈能给分析下这个hash函数吗?

[复制链接]
 楼主| sinanjj 发表于 2009-11-27 10:37 | 显示全部楼层 |阅读模式
本帖最后由 sinanjj 于 2009-11-27 10:39 编辑

Linux内核中,ip+port --> socket 的Hash函数是使用Jenkins函数。

http://burtleburtle.net/bob/hash/doobs.html

函数核心:

uint32_t jenkins_one_at_a_time_hash(unsigned char *key, size_t key_len)
{
    uint32_t hash = 0;
    size_t i;

    for (i = 0; i < key_len; i++) {
        hash += key;
        hash += (hash << 10);
        hash ^= (hash >> 6);
    }
    hash += (hash << 3);
    hash ^= (hash >> 11);
    hash += (hash << 15);
    return hash;
}

可参见:
http://en.wikipedia.org/wiki/Jenkins_hash_function
源码见附件

请将后缀名zip改为C

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| sinanjj 发表于 2009-11-27 10:39 | 显示全部楼层
为啥将key左移右移鼓捣鼓捣就鼓捣出来一个不重复的值了?

很不解
dengm 发表于 2009-11-28 11:14 | 显示全部楼层
hash += key;
==>> hash += key[i];
 楼主| sinanjj 发表于 2009-11-28 15:14 | 显示全部楼层
哪位大侠能系统而通俗的解释下?
 楼主| sinanjj 发表于 2009-11-29 10:27 | 显示全部楼层
李冬发 发表于 2009-11-29 15:48 | 显示全部楼层
不重复是不可能的。
zteclx 发表于 2009-11-29 16:55 | 显示全部楼层
好像实现HASH函数不是这么简单,不过有专用的DLL模块,可以直接调用
mohanwei 发表于 2009-11-29 20:01 | 显示全部楼层
这个要看它的数学公式,直接分析代码是不好理解的,尤其是代码做了工程优化的时候(如在满足精度前提下所有浮点运算换成定点乘法,甚至干脆用移位)
hotpower 发表于 2009-11-30 07:37 | 显示全部楼层
邓苗同志是行家~~~

不过HASH函数的定义宏观上看是“收敛的”和“压缩的”
而压缩又分为有损和无损。

想逆向它,就必须分析它归属那个“CRC编解码矩阵”,若散列的结果在某一“矩阵”内
且有规律,则HASH被**,否则只能叫“碰撞”。

故“王晓云将MD5**”应该是接近找到了那个“矩阵”而得到的一些碰撞。
zteclx 发表于 2009-11-30 19:01 | 显示全部楼层
好的HASH是无法**的
hotpower 发表于 2009-11-30 21:21 | 显示全部楼层

不赞成10楼zteclx的说法

10# zteclx

根据HASH自己的“定义”,菜农认为:“世上任何HASH函数都默认签署了投降协议”
对于任意长度的信息都将散列为一定固定长度的散列值。

举个很简单的例子:

假若某HASH散列长度为8位即散列到一个字节内,散列值为0x00到0xFF.

假若我们有257个字符的信息流数组,并假设前256个散列值未发生碰撞,
即散列值已填充完它自己的全部散列范围0x00~0xFF,

那麽试问:最后剩下的那个字节的散列值该是多少???

所以,任何HASH都是有碰撞的,因为“狼多肉少”不可能不发生碰撞。
只能说输入信息的长度不够。

HASH是有“碰撞概率”的虚伪承诺的~~~
hotpower 发表于 2009-11-30 21:22 | 显示全部楼层

极为赞成李冬发之观点,不过行话为HASH不可能不发生碰撞

zteclx 发表于 2009-11-30 21:58 | 显示全部楼层
大家对碰撞的概念理解错了。
这儿要澄清一下,HASH是“散列算法”,实用的应该是单向散列算法;
单向散列算法如MD4,MD5其关键的地方在于由结果不能倒推出原始值,就是根据散列值推不出原始值(简单地说,就是原始值有微小地变化,其HSAH值就有巨大地变化)。
至于说多对1,那是肯定的,就如楼上所说,HASH的结果位数是固定的。
但是你仍然不能由结果推导出原始数,这才是HASH的精华。[/
b]
hotpower 发表于 2009-11-30 23:29 | 显示全部楼层
zteclx讲解的不错,但都是“自欺欺人”的讲话~~~

应该承认,HASH很难求逆,但碰撞是设计者也无法知道和预测的~~~

故HASH的定义本来就成问题,我和王育民教授聊过此事,也知道了王晓云“**”MD5的“内幕”。

菜农从不用对称密码和其他密码及HASH函数,全用自己设计的,俺不相信别人。因为他们自己都不敢说~~~
mohanwei 发表于 2009-11-30 23:55 | 显示全部楼层
公共和自用的是不一样的的……
 楼主| sinanjj 发表于 2009-12-1 09:57 | 显示全部楼层
hotpower 给真传几种自己用的呗。

我这不是揭秘,就是要对现有IP+port做个ID就是hash(IP+port)得到一个struct的地址。

实际上就是linux内核里tcp/ip协议栈里的accept做的,生成文件描述符。


想用udp做个更快的。


原来都是直接用个数组,有多少种情况就声明多大的,现在这个ip+port有6位,无法分配这么多内存啊。。。。。。。。。。。。


只能用hash函数,可俺又看不懂,不放心。


hotpower前辈对这个问题有好办法么
 楼主| sinanjj 发表于 2009-12-1 10:00 | 显示全部楼层
10# zteclx  

根据HASH自己的“定义”,菜农认为:“世上任何HASH函数都默认签署了投降协议”
对于任意长度的信息都将散列为一定固定长度的散列值。

举个很简单的例子:

假若某HASH散列长度为8位即散列到一个字 ...
hotpower 发表于 2009-11-30 21:21



这个解释很通俗很易懂,不过这个俺也自己想明白过。。。。。。。。。

能不能解释点更深入的。
 楼主| sinanjj 发表于 2009-12-1 10:02 | 显示全部楼层
大家对碰撞的概念理解错了。
这儿要澄清一下,HASH是“散列算法”,实用的应该是单向散列算法;
单向散列算法如MD4,MD5其关键的地方在于由结果不能倒推出原始值,就是根据散列值推不出原始值(简单地说,就是原始值 ...
zteclx 发表于 2009-11-30 21:58


精华啥啊。。。你想,本来的信息都掉了它能用128位数推出你的1G A片来这才怪了呢。。。。。
 楼主| sinanjj 发表于 2009-12-1 10:03 | 显示全部楼层
zteclx讲解的不错,但都是“自欺欺人”的讲话~~~

应该承认,HASH很难求逆,但碰撞是设计者也无法知道和预测的~~~

故HASH的定义本来就成问题,我和王育民教授聊过此事,也知道了王晓云“**”MD5的“内幕”。

菜 ...
hotpower 发表于 2009-11-30 23:29


前辈给演示几招容易的,让晚辈学学。。。。
hotpower 发表于 2009-12-1 15:24 | 显示全部楼层

别诱使俺研究hash,倒塌hash,诱使俺犯罪~~~

用这个练习一番即刻,别诱使俺研究hash,倒塌hash,诱使俺犯罪~~~


带语音提示功能的HotWC3网上CRC超级运算器V5.01



您需要登录后才可以回帖 登录 | 注册

本版积分规则

456

主题

6300

帖子

25

粉丝
快速回复 在线客服 返回列表 返回顶部