我试图找到一个散列函数,它可以提供一些输出,这些输出的值在一定的值范围内均匀分布。输入的是ip地址。我们将ip地址作为密钥存储到hbase中,我的理解是rowkey在hbase中用于将每一行分发到不同的服务器区域。如果我们能够很好地分配ip地址,那么读/写性能应该会得到一定程度的提高。
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); }
uqzxnwby2#
你必须同时考虑ipv4和ipv6。幸运的是,您可以将它们中的每一个表示为整数—在ipv4中为32位,在ipv6中为128位。在这个问题中,您可以找到一个将ip地址转换为long(或ipv6的long数组)的代码示例。在将IP转换为数字之后,生成值的均匀分布函数就相当简单了。最简单的方法就是将余数除以某个数(例如,区域数)。
2条答案
按热度按时间s5a0g9ez1#
我很久以前就开始研究这个问题了。有趣的事实:简单的散列函数不能提供良好的伪随机分布。良好的分布只能通过非线性或加密散列来获得,如md5或sha1。在我们的解决方案中,我们使用了自定义非线性哈希,如下所示:
uqzxnwby2#
你必须同时考虑ipv4和ipv6。幸运的是,您可以将它们中的每一个表示为整数—在ipv4中为32位,在ipv6中为128位。
在这个问题中,您可以找到一个将ip地址转换为long(或ipv6的long数组)的代码示例。
在将IP转换为数字之后,生成值的均匀分布函数就相当简单了。最简单的方法就是将余数除以某个数(例如,区域数)。