哈希函数为 Hbase 分配 IP

Hashing functions to make IP distributed for Hbase

我试图找到一个散列函数,它可以提供一些输出,这些输出的值在特定的值范围内分布良好。输入将是 IP 地址。

我们将IP地址作为键存储到HBase中,我的理解是在hbase中使用rowkey将每一行分配到不同的区域服务器。如果我们能很好地分配 IP 地址,那么 read/write 性能应该会得到一定程度的改进。

您必须同时处理 IPv4 和 IPv6。幸运的是,您可以将它们中的每一个表示为整数 - 在 IPv4 中为 32 位,在 IPv6 中为 128 位。

您可以在 this question.

中找到将 ip 地址转换为 long(或 Ipv6 的 long 数组)的代码示例

将 IP 转换为数字后,对这些值进行均匀分布的函数就变得很简单了。最简单的方法就是将余数除以某个数字(例如区域数)。

很久以前我就已经解决过这个问题了。有趣的事实:简单的哈希函数不能提供良好的伪随机分布。良好的分布只能通过非线性或加密散列(如 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); 
}