打印

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

[复制链接]
5048|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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
源码见附件
lookup3.zip (34.52 KB)
请将后缀名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 | 只看该作者
哪位大侠能系统而通俗的解释下?

使用特权

评论回复
5
sinanjj|  楼主 | 2009-11-29 10:27 | 只看该作者

使用特权

评论回复
6
李冬发| | 2009-11-29 15:48 | 只看该作者
不重复是不可能的。

使用特权

评论回复
7
zteclx| | 2009-11-29 16:55 | 只看该作者
好像实现HASH函数不是这么简单,不过有专用的DLL模块,可以直接调用

使用特权

评论回复
8
mohanwei| | 2009-11-29 20:01 | 只看该作者
这个要看它的数学公式,直接分析代码是不好理解的,尤其是代码做了工程优化的时候(如在满足精度前提下所有浮点运算换成定点乘法,甚至干脆用移位)

使用特权

评论回复
9
hotpower| | 2009-11-30 07:37 | 只看该作者
邓苗同志是行家~~~

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

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

故“王晓云将MD5**”应该是接近找到了那个“矩阵”而得到的一些碰撞。

使用特权

评论回复
10
zteclx| | 2009-11-30 19:01 | 只看该作者
好的HASH是无法**的

使用特权

评论回复
11
hotpower| | 2009-11-30 21:21 | 只看该作者

不赞成10楼zteclx的说法

10# zteclx

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

举个很简单的例子:

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

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

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

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

HASH是有“碰撞概率”的虚伪承诺的~~~

使用特权

评论回复
12
hotpower| | 2009-11-30 21:22 | 只看该作者

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

使用特权

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

使用特权

评论回复
14
hotpower| | 2009-11-30 23:29 | 只看该作者
zteclx讲解的不错,但都是“自欺欺人”的讲话~~~

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

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

菜农从不用对称密码和其他密码及HASH函数,全用自己设计的,俺不相信别人。因为他们自己都不敢说~~~

使用特权

评论回复
15
mohanwei| | 2009-11-30 23:55 | 只看该作者
公共和自用的是不一样的的……

使用特权

评论回复
16
sinanjj|  楼主 | 2009-12-1 09:57 | 只看该作者
hotpower 给真传几种自己用的呗。

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

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


想用udp做个更快的。


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


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


hotpower前辈对这个问题有好办法么

使用特权

评论回复
17
sinanjj|  楼主 | 2009-12-1 10:00 | 只看该作者
10# zteclx  

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

举个很简单的例子:

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



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

能不能解释点更深入的。

使用特权

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


精华啥啊。。。你想,本来的信息都掉了它能用128位数推出你的1G A片来这才怪了呢。。。。。

使用特权

评论回复
19
sinanjj|  楼主 | 2009-12-1 10:03 | 只看该作者
zteclx讲解的不错,但都是“自欺欺人”的讲话~~~

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

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

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


前辈给演示几招容易的,让晚辈学学。。。。

使用特权

评论回复
20
hotpower| | 2009-12-1 15:24 | 只看该作者

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

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


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



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

456

主题

6300

帖子

25

粉丝