提及日期值的压缩,通常容易想到的办法是将日期转化成long类型,而后再经过变长整形进行压缩,我算了一下按照毫秒来算最多占用5个字节(能够经过“谈谈变长整型”中的表查看),确实节省了部分空间,可是还有优化的余地,由于实际状况下日期可能只精确到秒、小时或者天。优化
lucene里用1个字节header中的前3位表示可能出现的5种状况:编码
一、时间精确到毫秒 header前3位值为000.net
二、时间精确到天 header前3位值为110code
三、时间精确到小时 header前3位值为100blog
四、时间精确到秒 header前3位值为010get
五、最后一种状况lucene是把long类型的值看成普通的值来对待,也就是可能有负数,所以首先把long值通过zigzag进行编码将负数转正,而后利用header剩下的5位存储zigzag编码后的5位值,若是剩余的位值不等于0,header前3位值为001,而且将剩余的位值按照变长整形进行压缩。lucene里面的long类型便可对日期压缩也可对普通的值压缩,有兴趣的能够查看源码:源码
int header;
if (l % SECOND != 0) {
header = 0;
} else if (l % DAY == 0) {
header = DAY_ENCODING;
l /= DAY;
} else if (l % HOUR == 0) {
header = HOUR_ENCODING;
l /= HOUR;
} else {
header = SECOND_ENCODING;
l /= SECOND;
}it
final long zigZagL = BitUtil.zigZagEncode(l);
header |= (zigZagL & 0x1F); // last 5 bits
final long upperBits = zigZagL >>> 5;
if (upperBits != 0) {
header |= 0x20;
}
out.writeByte((byte) header);
if (upperBits != 0) {
out.writeVLong(upperBits);
}ast