SimCassandra: 比较long型整数

Cassandra的一大特性就是各Column的顺序在插入的时候就已经确定了,这表明Cassandra本身可能使用了插入排序的算法。

虽然之前研究了如何将Unix时间戳记转化为长整型数,但是如果不能进行比较的话就无法完成插入排序。

函数首先将两个长整型数unpack到两个数组中,每个数组4个元素,从1到4,分别代表从低到高的各个字。

$a1 = unpack(”v*”, $l1);

$a2 = unpack(”v*”, $l2);

然后从高位依次进行比较,如果相同就比较低16位,不同就直接返回,直到全部比较完毕。

注意:这里还是不能直接unpack成32位,PHP不能支持32位无符号整型数。

function compareLong($l1, $l2) {

$a1 = unpack(”v*”, $l1);

$a2 = unpack(”v*”, $l2);

for($i=4; $i>=1; $i–) {

$r = (int)$a1[$i] - (int)$a2[$i];

if($r != 0) {

break;

}

}

return $r;

}

$l1 = pack(”H*”, “58ba06b3de9c0400″);

$l2 = pack(”H*”, “58ba06b3de9c0400″);

var_dump(compareLong($l1, $l2));

BytesType的比较可能和LongType类似,只不过比较方向相反,从第一个字节开始。

留下回复