73,577 views / 2009.09.04 / 12:12 下午
研究Google chart API的时候发现它提供的数据压缩算法不错,可以把纯数字的数组压缩成很短的一个字符串,分享如下:
var simpleEncoding = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
function simpleEncode(values,maxValue) {
var chartData = ['s:'];
for (var i = 0; i < values.length; i++) { var currentValue = values[i]; if (!isNaN(currentValue) && currentValue >= 0) {
chartData.push(simpleEncoding.charAt(Math.round((simpleEncoding.length-1) * currentValue / maxValue)));
} else {
chartData.push('_');
}
}
return chartData.join('');
} |
var simpleEncoding = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
function simpleEncode(values,maxValue) {
var chartData = ['s:'];
for (var i = 0; i < values.length; i++) { var currentValue = values[i]; if (!isNaN(currentValue) && currentValue >= 0) {
chartData.push(simpleEncoding.charAt(Math.round((simpleEncoding.length-1) * currentValue / maxValue)));
} else {
chartData.push('_');
}
}
return chartData.join('');
}
测试例子:
var valueArray = new Array(20,100,40,50,60,81,74);
var maxValue = 100;
document.write(simpleEncode(valueArray,maxValue)); |
var valueArray = new Array(20,100,40,50,60,81,74);
var maxValue = 100;
document.write(simpleEncode(valueArray,maxValue));
41,690 views / 2009.09.01 / 8:08 下午
时代在进步,社会在发展,64位机的出现导致移位元算不再很轻易溢出,这固然是件值得高兴的事情,可在系统迁移中,忽然发现64位机器hash函数得出的结果居然与32位不一样,震惊之余赶紧研究算法在发现是移位运算符号的问题。
没办法,只好对系统进行判断,并针对64位机器重写了算法,代码如下:
if (exec("getconf LONG_BIT") == "32") {
function _hash($apszData = "", $MAX_TABLE_NUM = 0) {
$_hash = $x = $i = 0;
for($i = 0; $i < strlen($apszData); $i++) {
$_hash = ($_hash << 4) + ord($apszData[$i]);
if (($x = $_hash &0xF0000000) != 0) {
$_hash ^= ($x >> 24);
$_hash &= ~$x;
}
}
return ($_hash &0x7FFFFFFF) % $MAX_TABLE_NUM + 1;
}
} else {
function _hash($apszData = "", $MAX_TABLE_NUM = 0) {
$hash = $x = $i = 0;
for($i = 0; $i < strlen($apszData); $i++) {
$hash = ($hash << 4) + ((ord($apszData[$i])) << 32);
if (($x = $hash &0xF000000000000000) != 0) {
$hash ^= $x >> 24;
$hash &= (~$x) &0xFFFFFFFF00000000;
}
}
$ret = ($hash &0x7FFFFFFF00000000) % ($MAX_TABLE_NUM << 32) + (1 << 32);
$ret >>= 32;
$ret &= 0xFFFFFFFF;
return $ret;
}
} |
if (exec("getconf LONG_BIT") == "32") {
function _hash($apszData = "", $MAX_TABLE_NUM = 0) {
$_hash = $x = $i = 0;
for($i = 0; $i < strlen($apszData); $i++) {
$_hash = ($_hash << 4) + ord($apszData[$i]);
if (($x = $_hash &0xF0000000) != 0) {
$_hash ^= ($x >> 24);
$_hash &= ~$x;
}
}
return ($_hash &0x7FFFFFFF) % $MAX_TABLE_NUM + 1;
}
} else {
function _hash($apszData = "", $MAX_TABLE_NUM = 0) {
$hash = $x = $i = 0;
for($i = 0; $i < strlen($apszData); $i++) {
$hash = ($hash << 4) + ((ord($apszData[$i])) << 32);
if (($x = $hash &0xF000000000000000) != 0) {
$hash ^= $x >> 24;
$hash &= (~$x) &0xFFFFFFFF00000000;
}
}
$ret = ($hash &0x7FFFFFFF00000000) % ($MAX_TABLE_NUM << 32) + (1 << 32);
$ret >>= 32;
$ret &= 0xFFFFFFFF;
return $ret;
}
}
如果你不知道hash函数的作用,请参阅 http://baike.baidu.com/view/20089.htm