我正在尝试计算一个单词的“分数”,以便将其用于确定它在 Redis 排序集中的词典顺序(按字母顺序列出的单词)。
阅读这篇文章它说:
如何把一个单词变成一个分数?
例如,如果你想使用前四个字母来产生分数,这是规则:
分数 = 第一个字节值*(256^3) + 第二个字节值*(256^2) + 第三个字节值*(256^1) + 第四个字节值
如果单词的长度小于 4 个字符,则只需从总和不存在的字符中省略。
为什么这行得通?您只是将字节视为 radis-256 数字的数字:)
有了这个理论,我想出了以下代码来测试这是否可以在 PHP 数组中工作:
$words = array('abcd', 'hello', 'dogs', 'hiya');
$newWords = array();
foreach ($words as $word) {
$len = strlen($word);
if ($len > 4) {
$len = 4;
}
$i = 0;
$j = $len - 1;
$score = 0;
while ($i < $len) {
$byte = ord($word[$i]);
if ($j == 0) {
$score += $byte;
}
else {
$score += $byte * (256 ^ $j);
}
$i++;
$j--;
}
$newWords[$score] = $word;
}
ksort($newWords);
print_r($newWords);
但是,这会返回:
Array
(
[75950] => abcd
[80858] => hello
[81124] => dogs
[85220] => hiya
)
这不是按字母顺序排列的。
谁能发现这个问题(显然分数计算是错误的)?我可能误解了帖子:-/