散列函数,使hbase的ip分布

9nvpjoqh  于 2021-06-09  发布在  Hbase
关注(0)|答案(2)|浏览(339)

我试图找到一个散列函数,它可以提供一些输出,这些输出的值在一定的值范围内均匀分布。输入的是ip地址。
我们将ip地址作为密钥存储到hbase中,我的理解是rowkey在hbase中用于将每一行分发到不同的服务器区域。如果我们能够很好地分配ip地址,那么读/写性能应该会得到一定程度的提高。

s5a0g9ez

s5a0g9ez1#

我很久以前就开始研究这个问题了。有趣的事实:简单的散列函数不能提供良好的伪随机分布。良好的分布只能通过非线性或加密散列来获得,如md5或sha1。在我们的解决方案中,我们使用了自定义非线性哈希,如下所示:

// Substitute-box: non-linear transform. 
// Must be filled by random values prior to use
uint32_t s_box[256]; 

uint32_t ip_hash(const uint8_t *ip, uint8_t len) {
  uint32_t rc = 0x1f351f35;
  while(--len) {
    uint8_t x = *ip++;
    rc = ((rc << 7) | (rc >> (32-7))) + (s_box[x ^ (uint8_t)rc] ^ x);
  return rc ^ (rc >> 16); 
}
uqzxnwby

uqzxnwby2#

你必须同时考虑ipv4和ipv6。幸运的是,您可以将它们中的每一个表示为整数—在ipv4中为32位,在ipv6中为128位。
在这个问题中,您可以找到一个将ip地址转换为long(或ipv6的long数组)的代码示例。
在将IP转换为数字之后,生成值的均匀分布函数就相当简单了。最简单的方法就是将余数除以某个数(例如,区域数)。

相关问题