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

  • 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加密后会变成相同的密文 碰撞就是找出一个或多个加密后相同密文的原文

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

原创文章,作者:简单一点,如若转载,请注明出处:https://www.506064.com/n/127310.html

汽车小知识 小米SU7 今日油价 油耗计算器 电耗计算器 购置税计算器 贷款计算器 保险计算器 交通违章代码 体育新闻
(0)
简单一点的头像简单一点
上一篇 2024-10-03
下一篇 2024-10-03

相关推荐

  • PHP time()函数的用法

    PHP的time()函数是一种非常常见的函数,它可以获取当前时间的Unix时间戳,而Unix时间戳是从1970年1月1日开始计算的秒数。本文将从各个方面对PHP time()函数进…

    编程 2024-11-02
  • ActionItems详解

    一、概述 ActionItems是一种常见的管理事项的方式,它可以帮助团队有效地管理和跟踪任务。通常,它被用于项目管理、任务管理、会议记录等场景中。ActionItems可以追踪和…

    编程 2024-10-04
  • C++二维数组的声明与初始化

    一、C语言二维数组初始化 C语言的二维数组可以通过逐个赋值的方式进行初始化。例如: int a[2][3] = {{1, 2, 3}, {4, 5, 6}}; 该语句定义了一个2行…

    编程 2024-10-03
  • 用Python遍历List的方法

    介绍 在Python中,List是一种常见的数据类型,它可以保存任意类型的对象,包括数字、字符串、甚至是其他List等。对于处理List中的元素,最基本的就是遍历操作,也就是依次访…

    编程 2024-11-05
  • phpfile上传,php 上传

    本文目录一览: 1、php如何实现文件上传 2、php上传文件到文件夹 3、如何修改PHP上传文件大小限制? 4、php上传文件到服务器 php如何实现文件上传 所谓上传就是把文件…

    编程 2024-11-05
  • iOS中JSON转字典详解

    一、JSON和字典的基本介绍 JSON是一种数据格式,它可以跨语言进行数据传输,并且可以被各种编程语言轻松解析。而字典则是一种存储键值对的容器。在iOS开发中,JSON通常是从网络…

    编程 2024-10-03
  • 深入剖析SwiftDelegate

    一、SwiftDelegate是什么 SwiftDelegate是一种非常常见的编程模式,在iOS应用程序开发中尤为常见。SwiftDelegate实现了对象之间的协作,是一种非常…

    编程 2024-10-04
  • 生成一个简单的HTML标题(使用StringBuffer):Java工程师指南

    随着信息时代的发展,软件工程师在现代社会中变得越来越重要。特别是,随着Java编程语言在企业应用程序中的广泛应用,Java工程师这一职业变得越来越受欢迎。生成一个简单的HTML标题…

    编程 2024-10-04
  • python入门实践7的简单介绍

    1、《Python编程从入门到实践》txt下载在线阅读,求百度网盘云资源 2、求电子书:Python编程:从入门到实践 3、《Python编程:从入门到实践》在哪个阅读软件上可以看…

    编程 2024-10-03
  • python解析页面元素(python获取页面元素)

    本文目录一览: 1、用Python爬取网页并用xpath解析,得到一个内容相同的集合,为什么 2、「python爬虫保姆级教学」urllib的使用以及页面解析 3、python3怎…

    编程 2024-10-03

发表回复

登录后才能评论