hash算法简单介绍

来自:http://www.hackbase.com/tech/2009-06-15/53259.html

Hash,一般翻译做“散列”,也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。

  HASH算法的一般用途:
  HASH算法一般用于数据的校验.
  HASH算法原理:读者可以直接把HASH算法当成一个映射f : A  B . 输入为A, 长度不固定. 输出为B, B的长度是定好的. HASH算法也只是一类算法的统称, HASH算法有很多种. 我们也可以规定自己的HASH算法. 比如如下:
  规定:
  A: 字节序列, 长度不定.
  B: 一个字节.
  f : B = ∑A[i] % 256 . (I = 0,1,2, … length-1)
  以上就是一个非常简单的HASH算法. 它将输入字节序列的各个字节累加然后对256取模得到B字节.
  我们用C语言来表达这个算法可以如下:
  unsigned char get_hash(unsigned char * A, int A_len)
  {
  unsigned char B = 0;
  int i = 0;
  for(;i<A_len;++i)
  {
  B += A[i];
  B %= 256;
  }
  return B;
  }
  有的朋友会说, 咦, 你这个C实现的算法和你说的怎么不一样, 你说的f明明是先全部累加再对256取模的, 你这里怎么每次都取了一次摸了? 其实是这样的, 我们这里这样做的目的是防止当先全部累加时unsigned char 类型的B发生溢出现象, 所以这里每次都模了一次, 而这样对算法也没有影响的.
  因为根据数论知识, (A+B) % C = A%C + B%C .
  我们再来看另外一个例子:
  A: 一串字符串
  B: 四个字节的DWORD值.
  f: 所有字符累乘然后模以0xffffffff
  C语言算法如下:
  DWORD get_hash(char *str)
  {
  DWORD B = 0;
  int i = 0;
  for(;i<strlen(str);++i)
  {
  B *= (DWORD)str[i];
  B %= 0xffffffff;
  }
  return B;
  }
  相信大家都能很轻松的看懂上面的算法, 也能完全理解HASH的原理及思想.
  那么这一节的介绍就到这里, 接下来的几节我将会带领大家一起体验HASH算法在实战中的作用.
  P。S : 仅仅简单地介绍了下HASH, 不足或错误之处还请各位指点, 感激不尽!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值