PS:Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。MD5,SHA-1是常用SHA算法!
-
md5加密
$data = "Hello World"; $hash = md5($data); echo $hash; //32位 b10a8db164e0754105b7a99be72e3fe5
使用md5()运算出来的结果总是32个字符的字符串(md5() 第二个参数设置true,将得到16个字符的散列值),不过它只包含16进制的字符。
你可以使用md5()来处理很长的字符串和数据,但是你始终得到的是一个固定长度的hash值,不同的输入可能会散列成相同的输出,这也可能可以帮助你理解为什么这个函数是“单向”的。
提示:md5散列值16位和32区别及其破解难易
16位加密就是从32位MD5散列中把中间16位提取出来,破解16位MD5散列要比破解32位MD5散列还慢,因为他多了一个步骤,就是使用32位加密后再把中间16位提取出来, 然后再进行对比,而破解32位的则不需要,加密后直接对比就可以了$data = "Hello World"; $hash = md5($data); echo $hash; //32位 b10a8db164e0754105b7a99be72e3fe5 $hash = substr(md5($data),8,16); echo $hash; //16位 64e0754105b7a99b
-
crc32加密
这种算法产生一个32位的整数作为hash结果,这意味着只有2^32 (即4,294,967,296) 种可能的输出结果.
echo crc32('supersecretpassword'); // outputs: 323322056 echo crc32('MTIxMjY5MTAwNg=='); // outputs: 323322056
现在一个稍强一点的家用PC机就可以一秒钟运行十亿次hash函数,所以我们需要一个能产生更大范围的结果的hash函数。比如md5()就更合适一些,它可以产生128位的hash值,也就是有340,282,366,920,938,463,463,374,607,431,768,211,456种可能的 输出。
sha1()是一个更好的替代方案,因为它产生长达160位的hash值
提示:尽管crc32的hash概率相比md5高,但是可以在存储中作为”中介键值”,数字型查询永远都比相同长度字符串查询快很多 -
sha1加密
返回值是一个 40 字符长度的十六进制数字
$data = "Hello World"; $hash = sha1($data); echo $hash; //40位 0a4d55a8d778e5022fab701977c5d840bbc486d0