hyperdex 不同数据类型hash算法

发布: 2013-08-16 22:18

hyperdex使用hyperspace hashing算法对记录的每个字段做哈希,
并且所有字段的哈希值作为每个维度的值映射到多维度空间中的一个点上。
通过化分多维空间的方式,把所有的记录分布到不同的存储节点上,
实现hyperdex的分布式NoSQL功能。

对于hyperdex的实现,它所支持的土原子数据类型各自有不同的哈希算法,
原子类型有float,int64,string,每种类型的哈希算法如下:

字符串字段 cityhash
int64 unpack64le 把值高字节与低字节交换位置,64位为8个字节,即1,8交换,2,7交换,3,6交换,4,5交换
其他的同类整数类型,也使用相同的算法计算哈希结果。
float 即小数类型, 使用unpack64le,8字节前后对调
然后, hyperdex判断针对无穷大/小,是否是数字,0和正常小数分别做处理。
如果是>0的无穷大/小数,则结果为固定值, out = 0xfff0000000000000ULL + 2;
如果是其他的无穷大/小数,则结果为固定值 out = 0;
如果不是数字,则结果为固定值, out = 0xfff0000000000000ULL + 3;
如果等于0,则结果为固定值, out = 0x8000000000000000ULL + 1;
如果是其他正常的数字,则使用ieee754_double类型的标准处理,
ieee754_double d;
d.d = x;
uint64_t sign = d.ieee.negative ^ 0x1;
uint64_t exp = d.ieee.exponent;
uint64_t frac = d.ieee.mantissa0;
frac <<= 32;
frac |= d.ieee.mantissa1;
uint64_t shift = 2;

if (x < 0)
{
exp ^= 0x7ffULL;
frac ^= 0xfffffffffffffULL;
shift = 1;
}

out = (sign << 63) | (exp << 52) | (frac);
out += shift;



复合类型,list,set,map,集合中的数据类型必须一致。


原文: http://qtchina.tk/?q=node/757

Powered by zexport