- 1、php代码hash解析
- 2、PHP中用hash实现的数组
- 3、php程序员 hash碰撞原理是什么 怎么解决
将给定的明文密码通过加”盐”(干扰码)后,再经过哈希算法的sha512算法结果与哈希算法whirlpool算法的两个值进行与运算,将结果返回。
举例:(示例一下,例子未必形象)
假如你输入一个密码:123456
通过运算(自定义一个干扰码 abcd@!#$)
1、hash(”abcd@!#$”,”123456″)
2、用hash算法的sha512算法对(abcd@!#$123456)进行加密取得值a
3、用hash算法的whirlpool算法对(abcd@!#$123456)进行加密取得值b
4、将a和b进行二进制位与运算得到c
5、将c转化为十六进制数返回
通过该方法可以将用户的输入的明文进行加密,多用于用户密码的存储和比较。说白了就是只有输入的用户知道密码的明文,程序设计者、数据库管理员、黑客就算拿到加密的密文也不会知道(短时间内)密码的明文。
例外:如果黑客知道了使用的盐(干扰码)和算法,当然可以自己创建一个新的彩虹表,通过高性能计算是有可能将明文碰撞出来的,当然你可以个直接找到用户强迫他说出来~嘿嘿嘿~
PHP中使用最多的非Array莫属了,那Array是如何实现的?在PHP内部Array通过一个hashtable来实现,其中使用链接法解决hash冲突的问题,这样最坏情况下,查找Array元素的复杂度为O(N),最好则为1.
而其计算字符串hash值的方法如下,将源码摘出来以供查备:
复制代码
代码如下:
static
inline
ulong
zend_inline_hash_func(const
char
*arKey,
uint
nKeyLength)
{
register
ulong
hash
=
5381;
//此处初始值的设置有什么玄机么?
/*
variant
with
the
hash
unrolled
eight
times
*/
for
(;
nKeyLength
=
8;
nKeyLength
-=
8)
{
//这种step=8的方式是为何?
hash
=
((hash
5)
+
hash)
+
*arKey++;
hash
=
((hash
5)
+
hash)
+
*arKey++;
hash
=
((hash
5)
+
hash)
+
*arKey++;
hash
=
((hash
5)
+
hash)
+
*arKey++;
//比直接*33要快
hash
=
((hash
5)
+
hash)
+
*arKey++;
hash
=
((hash
5)
+
hash)
+
*arKey++;
hash
=
((hash
5)
+
hash)
+
*arKey++;
hash
=
((hash
5)
+
hash)
+
*arKey++;
}
switch
(nKeyLength)
{
case
7:
hash
=
((hash
5)
+
hash)
+
*arKey++;
/*
fallthrough…
*/
//此处是将剩余的字符hash
case
6:
hash
=
((hash
5)
+
hash)
+
*arKey++;
/*
fallthrough…
*/
case
5:
hash
=
((hash
5)
+
hash)
+
*arKey++;
/*
fallthrough…
*/
case
4:
hash
=
((hash
5)
+
hash)
+
*arKey++;
/*
fallthrough…
*/
case
3:
hash
=
((hash
5)
+
hash)
+
*arKey++;
/*
fallthrough…
*/
case
2:
hash
=
((hash
5)
+
hash)
+
*arKey++;
/*
fallthrough…
*/
case
1:
hash
=
((hash
5)
+
hash)
+
*arKey++;
break;
case
0:
break;
EMPTY_SWITCH_DEFAULT_CASE()
}
return
hash;//返回hash值
}
ps:对于以下函数,仍有两点不明:
hash
=
5381设置的理由?
这种step=8的循环方式是为了效率么?
hash函数相当于,把原空间的一个数据集映射到另外一个空间 或者可以理解为把一个原文通过hash函数编程另一个文本成为密文 这就是hash加密
比如md5 任何原文都会被加密成8位或者16位密文 8位16位密文是有穷的可以穷举而原文长度不限所以理论上是无穷的 这就会出现两个或多个不同的原文md5加密后会变成相同的密文 碰撞就是找出一个或多个加密后相同密文的原文
碰撞是存在的并不能完全解决我们只能让碰撞的概率尽可能减小 那就是把映射的空间或者说加密的密文边长 密文越长组合的方式越多发生碰撞的概率就越小