hash.init.php 3.4 KB

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