作者简介:

       姜海强:闷骚码农,互联网行业摸爬滚打数余载,先后担任中国体育直播TV主程、网信集团先锋支付架构师、奇虎360服务器端资深开发。热爱技术,喜欢分享,热衷领域:PHP/Golang语言、面向对象设计模式、Redis、Yaf、Yii2、微服务等。

视频课程

yaf+yar微服务-腾讯课堂
yaf+yar微服务-51CTO学院
CSDN学院

Github

个人主页
swoole-boot
roach
roach-orm

QQ群:

姜海强的QQ群

公众号:

360tryst公众号

hash扩展

hash扩展是PHP核心的一部分,使用hash扩展中的函数不需要安装扩展

hash是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值,PHP的hash扩展提供一些hash算法

hash算法一般是非可逆的,常用作数据签名

1.查看自己的PHP环境支持的hash算法

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Jiang Haiqiang
  5. * Date: 2020/7/7
  6. * Time: 10:53 PM
  7. */
  8. $algoList = hash_algos();
  9. var_dump($algoList);

作者的环境输出

  1. array(52) {
  2. [0]=>
  3. string(3) "md2"
  4. [1]=>
  5. string(3) "md4"
  6. [2]=>
  7. string(3) "md5"
  8. [3]=>
  9. string(4) "sha1"
  10. [4]=>
  11. string(6) "sha224"
  12. [5]=>
  13. string(6) "sha256"
  14. [6]=>
  15. string(6) "sha384"
  16. [7]=>
  17. string(10) "sha512/224"
  18. [8]=>
  19. string(10) "sha512/256"
  20. [9]=>
  21. string(6) "sha512"
  22. [10]=>
  23. string(8) "sha3-224"
  24. [11]=>
  25. string(8) "sha3-256"
  26. [12]=>
  27. string(8) "sha3-384"
  28. [13]=>
  29. string(8) "sha3-512"
  30. [14]=>
  31. string(9) "ripemd128"
  32. [15]=>
  33. string(9) "ripemd160"
  34. [16]=>
  35. string(9) "ripemd256"
  36. [17]=>
  37. string(9) "ripemd320"
  38. [18]=>
  39. string(9) "whirlpool"
  40. [19]=>
  41. string(10) "tiger128,3"
  42. [20]=>
  43. string(10) "tiger160,3"
  44. [21]=>
  45. string(10) "tiger192,3"
  46. [22]=>
  47. string(10) "tiger128,4"
  48. [23]=>
  49. string(10) "tiger160,4"
  50. [24]=>
  51. string(10) "tiger192,4"
  52. [25]=>
  53. string(6) "snefru"
  54. [26]=>
  55. string(9) "snefru256"
  56. [27]=>
  57. string(4) "gost"
  58. [28]=>
  59. string(11) "gost-crypto"
  60. [29]=>
  61. string(7) "adler32"
  62. [30]=>
  63. string(5) "crc32"
  64. [31]=>
  65. string(6) "crc32b"
  66. [32]=>
  67. string(6) "fnv132"
  68. [33]=>
  69. string(7) "fnv1a32"
  70. [34]=>
  71. string(6) "fnv164"
  72. [35]=>
  73. string(7) "fnv1a64"
  74. [36]=>
  75. string(5) "joaat"
  76. [37]=>
  77. string(10) "haval128,3"
  78. [38]=>
  79. string(10) "haval160,3"
  80. [39]=>
  81. string(10) "haval192,3"
  82. [40]=>
  83. string(10) "haval224,3"
  84. [41]=>
  85. string(10) "haval256,3"
  86. [42]=>
  87. string(10) "haval128,4"
  88. [43]=>
  89. string(10) "haval160,4"
  90. [44]=>
  91. string(10) "haval192,4"
  92. [45]=>
  93. string(10) "haval224,4"
  94. [46]=>
  95. string(10) "haval256,4"
  96. [47]=>
  97. string(10) "haval128,5"
  98. [48]=>
  99. string(10) "haval160,5"
  100. [49]=>
  101. string(10) "haval192,5"
  102. [50]=>
  103. string(10) "haval224,5"
  104. [51]=>
  105. string(10) "haval256,5"
  106. }

通过以上输出,我们可以看到我们常用的hash算法md5sha1sha256等。

2.对字符串进行hash运算

  1. <?php
  2. $data = 'Jhq';
  3. echo md5($data).PHP_EOL;
  4. echo hash('md5', $data).PHP_EOL;
  5. echo sha1($data).PHP_EOL;
  6. echo hash('sha1', $data).PHP_EOL;

以上例程输出

  1. 0af598817454940472f92cbb9eafd2d3
  2. 0af598817454940472f92cbb9eafd2d3
  3. d688d0d1393b796479878586c48ebc415327d159
  4. d688d0d1393b796479878586c48ebc415327d159

我们可以看到,我们常用的hash算法,PHP已经提供更友好的调用方式,但是同样可以通过调用hash方法实现,两种调用方式的结果是一致的。

3.对文件进行hash运算

我们创建文件hash.txt,文件内容如下

  1. Jhq

对hash.txt进行hash运算

  1. <?php
  2. echo md5_file(__DIR__.'/hash.txt').PHP_EOL;
  3. echo hash_file('md5',__DIR__.'/hash.txt').PHP_EOL;
  4. echo sha1_file(__DIR__.'/hash.txt').PHP_EOL;
  5. echo hash_file('sha1',__DIR__.'/hash.txt').PHP_EOL;

以上例程输出

  1. 0af598817454940472f92cbb9eafd2d3
  2. 0af598817454940472f92cbb9eafd2d3
  3. d688d0d1393b796479878586c48ebc415327d159
  4. d688d0d1393b796479878586c48ebc415327d159

我们可以看到,对文件进行hash运算时,常用的hash算法PHP也提供了友好的调用方式,同样也可以调用hash_file实现,两种实现方式一致。

另外,我们两次对内容Jhq进行hash运算,一种是通过对字符串,另一种是对文件,但是两次得到结果一致,可见对文件进行hash运算,可以用作文件内容校验,如果文件内容发生修改,文件的hash值就发生了变化。

4.hash_hmac算法

hash_hmac方法可以生成带有密钥的hash

  1. <?php
  2. $data = 'Jhq';
  3. echo hash_hmac('md5', $data, 'I am key').PHP_EOL;
  4. echo hash_hmac('sha1', $data, 'I am key').PHP_EOL;
  5. echo hash_hmac_file('md5', __DIR__.'/hash.txt', 'I am key').PHP_EOL;
  6. echo hash_hmac_file('sha1', __DIR__.'/hash.txt', 'I am key').PHP_EOL;

以上例程输出

  1. 59cb282953d3bd3f5ac4f4e5092f98e2
  2. 4357d4bba84d5e7574309071c27a8504c9c45060
  3. 59cb282953d3bd3f5ac4f4e5092f98e2
  4. 4357d4bba84d5e7574309071c27a8504c9c45060

同样的,hash_hmac也可以对字符串和文件进行hash运算,并且运算结果一致。

QQ群:

姜海强的QQ群

公众号:

360tryst公众号