Ücretli destek olacak kişiler aranıyor.
Node.js versiyonu var orada 30-40 ms de çalışıyor, PHP'de 900 ms 1200 ms v.s. oluyor neden bu kadar yavaş anlamıyorum.
<?php require_once "./HashRing.php"; use Chxj1992\HashRing\HashRing; $keyword= ["a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13", "a14", "a15", "a16", "a17", "a18", "a19", "a20", "a21", "a22", "a23", "a24", "a25", "a26", "a27", "a28", "a29", "a30", "a31", "a32", "a33", "a34", "a35", "a36", "a37", "a38", "a39", "a40", "a41", "a42", "a43", "a44", "a45", "a46", "a47", "a48", "a49", "a50", "a51", "a52", "a53", "a54", "a55", "a56", "a57", "a58", "a59", "a60", "a61", "a62", "a63", "a64", "a65", "a66", "a67", "a68", "a69", "a70", "a71", "a72", "a73", "a74", "a75", "a76", "a77", "a78", "a79", "a80", "a81", "a82", "a83", "a84", "a85", "a86", "a87", "a88", "a89", "a90", "a91", "a92", "a93", "a94", "a95", "a96", "a97", "a98", "a99", "a100", "a101", "a102", "a103", "a104", "a105", "a106", "a107", "a108", "a109", "a110", "a111", "a112", "a113", "a114", "a115", "a116", "a117", "a118", "a119", "a120", "a121", "a122", "a123", "a124", "a125", "a126", "a127", "a128", "a129", "a130", "a131", "a132", "a133", "a134", "a135", "a136", "a137", "a138", "a139", "a140", "a141", "a142", "a143", "a144", "a145", "a146", "a147", "a148", "a149", "a150", "a151", "a152", "a153", "a154", "a155", "a156", "a157", "a158", "a159", "a160", "a161", "a162", "a163", "a164", "a165", "a166", "a167", "a168", "a169", "a170", "a171", "a172", "a173", "a174", "a175", "a176", "a177", "a178", "a179", "a180", "a181", "a182", "a183", "a184", "a185", "a186", "a187", "a188", "a189", "a190", "a191", "a192", "a193", "a194", "a195", "a196", "a197", "a198", "a199", "a200", "a201", "a202", "a203", "a204", "a205", "a206", "a207", "a208", "a209", "a210", "a211", "a212", "a213", "a214", "a215", "a216", "a217", "a218", "a219", "a220", "a221", "a222", "a223", "a224", "a225", "a226", "a227", "a228", "a229", "a230", "a231", "a232", "a233", "a234", "a235", "a236", "a237", "a238", "a239", "a240", "a241", "a242", "a243", "a244", "a245", "a246", "a247", "a248", "a249", "a250", "a251", "a252", "a253", "a254", "a255", "a256", "a257", "a258", "a259", "a260", "a261", "a262", "a263", "a264", "a265", "a266", "a267", "a268", "a269", "a270", "a271", "a272", "a273", "a274", "a275", "a276", "a277", "a278", "a279", "a280", "a281", "a282", "a283", "a284", "a285", "a286", "a287", "a288", "a289", "a290", "a291", "a292", "a293", "a294", "a295", "a296", "a297", "a298", "a299", "a300", "a301", "a302", "a303", "a304", "a305", "a306", "a307", "a308", "a309", "a310", "a311", "a312", "a313", "a314", "a315", "a316", "a317", "a318", "a319", "a320", "a321", "a322", "a323", "a324", "a325", "a326", "a327", "a328", "a329", "a330", "a331", "a332", "a333", "a334", "a335", "a336", "a337", "a338", "a339", "a340", "a341", "a342", "a343", "a344", "a345", "a346", "a347", "a348", "a349", "a350", "a351", "a352", "a353", "a354", "a355", "a356", "a357", "a358", "a359", "a360", "a361", "a362", "a363", "a364", "a365", "a366", "a367", "a368", "a369", "a370", "a371", "a372", "a373", "a374", "a375", "a376", "a377", "a378", "a379", "a380", "a381", "a382", "a383", "a384", "a385", "a386", "a387", "a388", "a389", "a390", "a391", "a392", "a393", "a394", "a395", "a396", "a397", "a398", "a399", "a400", "a401", "a402", "a403", "a404", "a405", "a406", "a407", "a408", "a409", "a410", "a411", "a412", "a413", "a414", "a415", "a416", "a417", "a418", "a419", "a420", "a421", "a422", "a423", "a424", "a425", "a426", "a427", "a428", "a429", "a430", "a431", "a432", "a433", "a434", "a435", "a436", "a437", "a438", "a439", "a440", "a441", "a442", "a443", "a444", "a445", "a446", "a447", "a448", "a449", "a450", "a451", "a452", "a453", "a454", "a455", "a456", "a457", "a458", "a459", "a460", "a461", "a462", "a463", "a464", "a465", "a466", "a467", "a468", "a469", "a470", "a471", "a472", "a473", "a474", "a475", "a476", "a477", "a478", "a479", "a480", "a481", "a482", "a483", "a484", "a485", "a486", "a487", "a488", "a489", "a490", "a491", "a492", "a493", "a494", "a495", "a496", "a497", "a498", "a499", "a500"]; $userId = ""; $hashRing = new HashRing($keyword); $table = $hashRing->getNode($_GET['id']); print_r($table);
<?php
namespace Chxj1992\HashRing;
class HashRing
{
private $ring = [];
private $sortedKeys = [];
private $nodes = [];
private $weights = [];
public function __construct(array $nodes)
{
if (array_keys($nodes) !== range(0, count($nodes) - 1)) {
$this->nodes = array_keys($nodes);
$this->weights = $nodes;
} else {
$this->nodes = $nodes;
}
$this->generateCircle();
}
public function updateWithWeights(array $weights)
{
if ($weights != $this->weights) {
return false;
}
$this->weights = $weights;
$this->nodes = array_keys($weights);
$this->generateCircle();
return true;
}
public function getNode($stringKey)
{
$pos = $this->getNodePos($stringKey);
if ($pos === false) {
return "";
}
return $this->ring[$this->sortedKeys[$pos]];
}
public function getNodePos($stringKey)
{
if (count($this->ring) == 0) {
return false;
}
$key = $this->genKey($stringKey);
$pos = $this->search(count($this->sortedKeys), function ($i) use ($key) {
return $this->sortedKeys[$i] > $key;
});
if ($pos == count($this->sortedKeys)) {
return 0;
} else {
return $pos;
}
}
/**
* Get from golang sort.Search()
* @param $n
* @param \Closure $operator
* @return int
*/
private function search($n, \Closure $operator)
{
$i = 0;
$j = $n;
while ($i < $j) {
$h = $i + intval(($j - $i) / 2);
if (!$operator($h)) {
$i = $h + 1;
} else {
$j = $h;
}
}
return $i;
}
public function genKey($stringKey)
{
$bKey = $this->hashDigest($stringKey);
return $this->hashVal(array_slice($bKey, 0, 4));
}
public function getNodes($stringKey, $size)
{
$pos = $this->getNodePos($stringKey);
if ($pos === false) {
return [];
}
if ($size > count($this->nodes)) {
return [];
}
$returnedValues = [];
$resultSlice = [];
for ($i = $pos; $i < $pos + count($this->sortedKeys); $i++) {
$key = $this->sortedKeys[$i % count($this->sortedKeys)];
$val = $this->ring[$key];
if (empty($returnedValues[$val])) {
$returnedValues[$val] = true;
$resultSlice[] = $val;
}
if (count($returnedValues) == $size) {
break;
}
}
return $resultSlice;
}
public function addNode($node)
{
return $this->addWeightedNode($node, 1);
}
public function addWeightedNode($node, $weight)
{
if ($weight <= 0 OR in_array($node, $this->nodes)) {
return false;
}
$this->nodes[] = $node;
$this->weights[$node] = $weight;
$this->generateCircle();
return true;
}
public function updateWeightedNode($node, $weight)
{
/* node is not need to update for node is not existed or weight is not changed */
if ($weight <= 0 OR empty($this->weights[$node]) OR $this->weights[$node] == $weight) {
return false;
}
$this->weights[$node] = $weight;
$this->generateCircle();
return true;
}
public function removeNode($node)
{
/* if node isn't exist in hashring, don't refresh hashring */
if (!in_array($node, $this->nodes)) {
return false;
}
if (($key = array_search($node, $this->nodes)) !== false) {
unset($this->nodes[$key]);
}
unset($this->weights[$node]);
$this->generateCircle();
return true;
}
private function getNodeWeight($node)
{
return empty($this->weights[$node]) ? 1 : intval($this->weights[$node]);
}
private function generateCircle()
{
$this->ring = [];
$this->sortedKeys = [];
$totalWeight = 0;
foreach ($this->nodes as $node) {
$totalWeight += $this->getNodeWeight($node);
}
foreach ($this->nodes as $node) {
$weight = $this->getNodeWeight($node);
$factor = floor(40 * count($this->nodes) * $weight) / $totalWeight;
for ($j = 0; $j < $factor; $j++) {
$nodeKey = $node . '-' . $j;
$bKey = $this->hashDigest($nodeKey);
for ($i = 0; $i < 3; $i++) {
$key = $this->hashVal(array_slice($bKey, $i * 4, 4));
$this->ring[$key] = $node;
$this->sortedKeys[] = $key;
}
}
}
sort($this->sortedKeys);
}
private function hashDigest($key)
{
return array_map(function ($byte) {
return ord($byte);
}, str_split(md5($key, TRUE)));
}
private function hashVal($bKey)
{
return
($bKey[3] << 24) |
($bKey[2] << 16) |
($bKey[1] << 8) |
($bKey[0]);
}
}
?>

