首页 > 后端开发 > 正文

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

2024-09-14 23:33:46 | 我爱编程网

我爱编程网小编给大家带来了php程序员 hash碰撞原理是什么 怎么解决相关文章,一起来看一下吧。

本文目录一览:

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

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

hash函数相当于,把原空间的一个数据集映射到另外一个空间 或者可以理解为把一个原文通过hash函数编程另一个文本成为密文 这就是hash加密
比如md5 任何原文都会被加密成8位或者16位密文 8位16位密文是有穷的可以穷举而原文长度不限所以理论上是无穷的 这就会出现两个或多个不同的原文md5加密后会变成相同的密文 碰撞就是找出一个或多个加密后相同密文的原文
碰撞是存在的并不能完全解决我们只能让碰撞的概率尽可能减小 那就是把映射的空间或者说加密的密文边长 密文越长组合的方式越多发生碰撞的概率就越小

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

thinkphp redis 怎么选择数据库

1、redis 中的每一个数据库,都由一个 redisDb 的结构存储。其中,redisDb.id 存储着 redis 数据库以整数表示的号码。redisDb.dict 存储着该库所有的键值对数据。redisDb.expires 保存着每一个键的过期时间。

2、当redis 服务器初始化时,会预先分配 16 个数据库(该数量可以通过配置文件配置),所有数据库保存到结构 redisServer 的一个成员 redisServer.db 数组中。当我们选择数据库 select number 时,程序直接通过 redisServer.db[number] 来切换数据库。有时候当程序需要知道自己是在哪个数据库时,直接读取 redisDb.id 即可。

3、既然我们知道一个数据库的所有键值都存储在redisDb.dict中,那么我们要知道如果找到key的位置,就有必要了解一下dict 的结构了:

typedef struct dict {

// 特定于类型的处理函数
dictType *type;

// 类型处理函数的私有数据
void *privdata;

// 哈希表(2个)
dictht ht[2];

// 记录 rehash 进度的标志,值为-1 表示 rehash 未进行
int rehashidx;

// 当前正在运作的安全迭代器数量
int iterators;
} dict;
由上述的结构可以看出,redis 的字典使用哈希表作为其底层实现。dict 类型使用的两个指向哈希表的指针,其中 0 号哈希表(ht[0])主要用于存储数据库的所有键值,而1号哈希表主要用于程序对 0 号哈希表进行 rehash 时使用,rehash 一般是在添加新值时会触发,这里不做过多的赘述。所以redis 中查找一个key,其实就是对进行该dict 结构中的 ht[0] 进行查找操作。

4、既然是哈希,那么我们知道就会有哈希碰撞,那么当多个键哈希之后为同一个值怎么办呢?redis采取链表的方式来存储多个哈希碰撞的键。也就是说,当根据key的哈希值找到该列表后,如果列表的长度大于1,那么我们需要遍历该链表来找到我们所查找的key。当然,一般情况下链表长度都为是1,所以时间复杂度可看作o(1)。

二、当redis 拿到一个key 时,如果找到该key的位置。

了解了上述知识之后,我们就可以来分析redis如果在内存找到一个key了。

1、当拿到一个key后, redis 先判断当前库的0号哈希表是否为空,即:if (dict->ht[0].size == 0)。如果为true直接返回NULL。

2、判断该0号哈希表是否需要rehash,因为如果在进行rehash,那么两个表中者有可能存储该key。如果正在进行rehash,将调用一次_dictRehashStep方法,_dictRehashStep 用于对数据库字典、以及哈希键的字典进行被动 rehash,这里不作赘述。

3、计算哈希表,根据当前字典与key进行哈希值的计算。

4、根据哈希值与当前字典计算哈希表的索引值。

5、根据索引值在哈希表中取出链表,遍历该链表找到key的位置。一般情况,该链表长度为1。

6、当 ht[0] 查找完了之后,再进行了次rehash判断,如果未在rehashing,则直接结束,否则对ht[1]重复345步骤。

到此我们就找到了key在内存中的位置了。

php程序员 hash碰撞原理是什么 怎么解决我爱编程网

用php将密码存入数据库,用什么方法进行加密?

我爱编程网(https://www.52biancheng.com)小编还为大家带来用php将密码存入数据库,用什么方法进行加密?的相关内容。

题主你可以使用 md5 或者 sha1 进行初步处理,但为了更加安全,请你同时加上两个 salt,一个静态 salt,一个动态的 salt。以 md5 为例:\x0d\x0a假设通过 POST 传来的密码为 $_POST['password'],在存入 DB 前先进行如下的操作:\x0d\x0a$password = hash('md5', $_POST['password'].$staticSalt.$dynamicSalt);\x0d\x0a\x0d\x0a为了保证动态 salt 的唯一性,可以这样操作:\x0d\x0a$dynamicSalt = hash('md5', microtime());\x0d\x0a\x0d\x0a对于动态的 salt 可以与生成的密码一起保存在 DB 中,而静态 salt 则可以直接放在类文件中(例如定义为一个静态属性即可)。\x0d\x0a首先谢谢题主采纳了我的答案,但是我之前的回答并不是最佳答案,之所以有此加密的想法源于自己所读的源码可能比较老,所以并没使用上较新版本的加密方法,例如 bcrypt等。\x0d\x0a此外,第二点,感谢评论中几位前辈的提点,已经明白设置静态 salt 的意义并不大,生成一个较长的动态 salt 已然可以解决问题。\x0d\x0a\x0d\x0aLZ应该采用加盐HASH。\x0d\x0a如何“腌制”密码呢?\x0d\x0a=_,=\x0d\x0a正确的格式应该是,用户password+动态的salt\x0d\x0a动态的salt不能像2L所说的,使用microtime,因为时间在某些情况下不够随机,而且是可能被猜解的。\x0d\x0a这里推荐一个我用的加盐HASH\x0d\x0a$salt=base64_encode(mcrypt_create_iv(32,MCRYPT_DEV_RANDOM));\x0d\x0a$password=sha1($register_password.$salt);\x0d\x0a\x0d\x0a解释:\x0d\x0a首先使用mcrypt,产生电脑随机生成的,专门用户加密的随机数函数。\x0d\x0a第二步,把得到的随机数通过base64加密,使其变长并且不利于猜解。\x0d\x0a第三步,把得出的盐拼接到密码的后面,再对其使用sha1进行哈希\x0d\x0a再把password存入到用户的数据库。\x0d\x0aPS:为何不用静态的salt?没有必要,使用一个动态随机足够长的盐足矣。\x0d\x0a为何不用MD5?因为长度不够。\x0d\x0a为何没有使用多次HASH?因为这样反而容易发生碰撞。\x0d\x0aHASH好之后怎么使用“腌制”好的密码?\x0d\x0a用户注册->提交密码->产生salt->腌制好的密码存入数据库->salt存入数据库。\x0d\x0a用户登录->提交密码->调用salt接到提交密码的后面->进行HASH->调用之前注册腌制好的密码->对比HASH值是否和这个密码相同

以上就是我爱编程网小编给大家带来的php程序员 hash碰撞原理是什么 怎么解决,希望能对大家有所帮助。更多相关文章关注我爱编程网:www.52biancheng.com

免责声明:文章内容来自网络,如有侵权请及时联系删除。
与“php程序员 hash碰撞原理是什么 怎么解决”相关推荐
电脑程序员怎么学???
电脑程序员怎么学???

电脑程序员怎么学???程序员的岗位需求很多,例如大型网络公司、软件开发公司等等都需要程序员。程序员需要学习:1、掌握数据及其转换、数据的机内表示、算术和逻辑运算,以及相关的应用数学基础知识;2、理解计算机的组成以及各主要部件的性能指标;3、掌握操作系统、程序设计语言的基础知识;4、熟练掌握计算机常用办公软件的基本操作方法;5、熟练掌握基本数据结构和常用算法;6、

2024-06-20 12:24:21
PHP处理内存问题,怎么解决
PHP处理内存问题,怎么解决

PHP管理内存函数memory_get_usage()使用介绍下面是PHPmemory_get_usage()使用示例:复制代码代码如下:echomemory_get_usage(),'<br/>';//143952$tmp=str_repeat('',4000);echomemory_get_usage(),'&l

2024-10-15 05:49:09
JAVA程序有时候突然停了, 怎么解决?
JAVA程序有时候突然停了, 怎么解决?

java程序一闪就没了用vsiualstudio2005是调试C#吧,在程序Main方法最后加上一句代码Console.ReadLine();因为在C#中在控制台输出的程序,输出后窗口就关闭了,加上上面那句代码,就是说让程序停下来,等着从键盘输入一只菜鸟想用eclipse写JAVA,构建的第一个超简单的图形界面程序,程序运行窗口却一闪而逝。package com.swing;i

2024-04-11 16:59:33
数据库原理中ob是什么意思
数据库原理中ob是什么意思

数据库原理中ob是什么意思相关函数简介:1、Flush:刷新缓冲区的内容,输出。函数格式:flush()说明:这个函数经常使用,效率很高。2、ob_start:打开输出缓冲区函数格式:voidob_start(void)说明:当缓冲区激活时,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区。为了输出缓冲区的内容,可以使用ob_end_flush()或f

2024-12-13 22:24:13
什么是BOM头,及PHP解决办法
什么是BOM头,及PHP解决办法

什么是BOM头,及PHP解决办法类似WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF0xBB0xBF,即BOM)。它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。对于一般的文件,这样并不会产生什么麻烦。但对于PHP来说,BOM是个大麻烦。PHP并不会忽略BOM,所以在读取、包含或者

2024-12-14 11:36:27
PHP程序中怎么解决“未定义的索引”这个问题
PHP程序中怎么解决“未定义的索引”这个问题

PHP语言PHP语言里的位运算符&、|、^、~、〈〈、〉〉这些符号我一个也不懂,希望高手给个全面的解释!拜"&"按位与运算按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0。参与运算的数以补码方式出现。例如:9&5可写算式如下:00001001(9的二进制补码)&

2024-08-20 08:20:49
如何解决php导入csv文件碰到乱码的问题
如何解决php导入csv文件碰到乱码的问题

如何解决php导入csv文件碰到乱码的问题方法一:函数mb_convert_encoding();作如下设置$str=mb_convert_encoding($str,"UTF-8","GBK");然后就可以了。方法二:函数iconv();作如下设置iconv(‘GBK',”UTF-8//TRANSLIT//IGNORE”,$str);php中exec乱码问题怎么解决?在PHP中

2025-02-24 21:49:34
java程序运行超时怎么解决 北大青鸟java培训:在Java程序中处理数据库超时与死锁?
java程序运行超时怎么解决 北大青鸟java培训:在Java程序中处理数据库超时与死锁?

北大青鸟java培训:在Java程序中处理数据库超时与死锁?每个使用关系型数据库的程序都可能遇到数据死锁或不可用的情况,而这些情况需要在代码中编程来解决;本文主要介绍与数据库事务死锁等情况相关的重试逻辑概念,此外,还会探讨如何避免死锁等问题,文章以DB2(版本9)与为例进行讲解。什么是数据库锁定与死锁锁定(Locking)发生在当一个事务获得对某一资源的“锁”时,这时,其他的事务就不能

2024-07-01 08:29:15