【发布时间】:2015-11-25 03:48:41
【问题描述】:
我正在尝试找到一个哈希函数,它可以提供一些输出,这些输出的值很好地分布在某个值范围内。输入将是 IP 地址。
我们将 IP 地址作为 key 存储到 HBase 中,我的理解是在 hbase 中使用 rowkey 将每一行分配到不同的区域服务器。如果我们可以很好地分配 IP 地址,那么读/写性能应该会得到一定程度的提升。
【问题讨论】:
标签: algorithm hash hbase distributed
我正在尝试找到一个哈希函数,它可以提供一些输出,这些输出的值很好地分布在某个值范围内。输入将是 IP 地址。
我们将 IP 地址作为 key 存储到 HBase 中,我的理解是在 hbase 中使用 rowkey 将每一行分配到不同的区域服务器。如果我们可以很好地分配 IP 地址,那么读/写性能应该会得到一定程度的提升。
【问题讨论】:
标签: algorithm hash hbase distributed
您必须同时注意 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);
}
【讨论】: