首页 > 编程知识 正文

php中使用hash(PHP中使用函数返回值完成两个数的加减乘除)

时间:2023-12-08 14:00:29 阅读:313321 作者:PEIW

本文目录一览:

  • 1、php代码hash解析
  • 2、PHP中用hash实现的数组
  • 3、php程序员 hash碰撞原理是什么 怎么解决

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中用hash实现的数组

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的循环方式是为了效率么?

php程序员 hash碰撞原理是什么 怎么解决

hash函数相当于,把原空间的一个数据集映射到另外一个空间 或者可以理解为把一个原文通过hash函数编程另一个文本成为密文 这就是hash加密

比如md5 任何原文都会被加密成8位或者16位密文 8位16位密文是有穷的可以穷举而原文长度不限所以理论上是无穷的 这就会出现两个或多个不同的原文md5加密后会变成相同的密文 碰撞就是找出一个或多个加密后相同密文的原文

碰撞是存在的并不能完全解决我们只能让碰撞的概率尽可能减小 那就是把映射的空间或者说加密的密文边长 密文越长组合的方式越多发生碰撞的概率就越小

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。