is_init == 1) { if (is_array($node)) { foreach ($node as $string) { $key = $this->hash_md5($string); self::$hash_table[$this->hash_crc($key)] = array( $key, $string ); $this->add_virtual_node($string, $num); self::$hash_list[] = $this->hash_crc($key); } sort(self::$hash_list); } $table = '$hash_table = ' . var_export(self::$hash_table, TRUE) . ';'; $list = '$hash_list = ' . var_export(self::$hash_list, TRUE); $value = ''; @file_put_contents($this->filename, $value); } return true; } /** * 一致性hash:获取hash对应的节点值 * @param string $node 字符串 * @return int */ public function get_node($string) { $key = $this->hash_md5($string); $key_val = $this->hash_crc($key); $result = $start = 0; if (empty(self::$hash_table) && empty(self::$hash_list)) { include_once($this->filename); self::$hash_table = $hash_table; self::$hash_list = $hash_list; } foreach (self::$hash_list as $val) { if ($start == 0) $result = $val; if ($key_val < $val) { $result = $val; break; } $start = 1; } return self::$hash_table[$result][1]; } /** * 一致性hash:生成虚拟节点 * @param string $string 字符串 * @param string $num 虚拟节点 * @return int */ public function add_virtual_node($string, $num) { $num = (int) $num; if ($num < 1) return false; for ($i=0; $i<$num; $i++) { $key = $this->hash_md5($string . '#' . $i); self::$hash_table[$this->hash_crc($key)] = array($key, $string); self::$hash_list[] = $this->hash_crc($key); } } /** * 一致性hash,计算一个字符串的 crc32 多项式 * @param string $string 字符串 * @return int */ private function hash_crc($string) { return crc32($string); } /** * 一致性hash:MD5加密得到KEY值 * @param string $string 字符串 * @return int */ private function hash_md5($string) { return md5($string); } }