hash.init.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. <?php
  2. if (!defined('IS_INITPHP')) exit('Access Denied!');
  3. /*********************************************************************************
  4. * InitPHP 3.8.2 国产PHP开发框架 扩展类库-一致性HASH
  5. *-------------------------------------------------------------------------------
  6. * 版权所有: CopyRight By initphp.com
  7. * 您可以自由使用该源码,但是在使用过程中,请保留作者信息。尊重他人劳动成果就是尊重自己
  8. *-------------------------------------------------------------------------------
  9. * Author:zhuli Dtime:2014-11-25
  10. ***********************************************************************************/
  11. class hashInit {
  12. private static $hash_table = array(); //hash_table,存放hash对应值
  13. private static $hash_list = array(); //存放值
  14. private $is_init = 1; //hash_table初始化-0关闭,1开启,当初始化完毕之后,关闭该功能
  15. private $filename = 'data/hash_table.php'; //hash_table缓存路径
  16. /**
  17. * 一致性hash:添加节点
  18. * 只有当且仅当开启is_init初始化hash_table的时候
  19. * hash_table文件才会生成
  20. * @param string $node 字符串
  21. * @param string $num 虚拟节点
  22. * @return int
  23. */
  24. public function add_node($node, $num = 0) {
  25. if ($this->is_init == 1) {
  26. if (is_array($node)) {
  27. foreach ($node as $string) {
  28. $key = $this->hash_md5($string);
  29. self::$hash_table[$this->hash_crc($key)] = array(
  30. $key,
  31. $string
  32. );
  33. $this->add_virtual_node($string, $num);
  34. self::$hash_list[] = $this->hash_crc($key);
  35. }
  36. sort(self::$hash_list);
  37. }
  38. $table = '$hash_table = ' . var_export(self::$hash_table, TRUE) . ';';
  39. $list = '$hash_list = ' . var_export(self::$hash_list, TRUE);
  40. $value = '<?php ' . $table . $list . '?>';
  41. @file_put_contents($this->filename, $value);
  42. }
  43. return true;
  44. }
  45. /**
  46. * 一致性hash:获取hash对应的节点值
  47. * @param string $node 字符串
  48. * @return int
  49. */
  50. public function get_node($string) {
  51. $key = $this->hash_md5($string);
  52. $key_val = $this->hash_crc($key);
  53. $result = $start = 0;
  54. if (empty(self::$hash_table) && empty(self::$hash_list)) {
  55. include_once($this->filename);
  56. self::$hash_table = $hash_table;
  57. self::$hash_list = $hash_list;
  58. }
  59. foreach (self::$hash_list as $val) {
  60. if ($start == 0) $result = $val;
  61. if ($key_val < $val) {
  62. $result = $val;
  63. break;
  64. }
  65. $start = 1;
  66. }
  67. return self::$hash_table[$result][1];
  68. }
  69. /**
  70. * 一致性hash:生成虚拟节点
  71. * @param string $string 字符串
  72. * @param string $num 虚拟节点
  73. * @return int
  74. */
  75. public function add_virtual_node($string, $num) {
  76. $num = (int) $num;
  77. if ($num < 1) return false;
  78. for ($i=0; $i<$num; $i++) {
  79. $key = $this->hash_md5($string . '#' . $i);
  80. self::$hash_table[$this->hash_crc($key)] = array($key, $string);
  81. self::$hash_list[] = $this->hash_crc($key);
  82. }
  83. }
  84. /**
  85. * 一致性hash,计算一个字符串的 crc32 多项式
  86. * @param string $string 字符串
  87. * @return int
  88. */
  89. private function hash_crc($string) {
  90. return crc32($string);
  91. }
  92. /**
  93. * 一致性hash:MD5加密得到KEY值
  94. * @param string $string 字符串
  95. * @return int
  96. */
  97. private function hash_md5($string) {
  98. return md5($string);
  99. }
  100. }