通过Hash函数对数据进行分区

本文关键字:分区 数据 Hash 函数 通过 | 更新日期: 2023-09-27 18:01:57

我需要在分布式缓存中的n个节点上均匀地分割数据。

下面的代码将获取一个缓存键并确定要使用哪个Node:

public static int GetNodeIDByCacheKey(string key)
{
    return Math.Abs(key.GetHashCode()) % TotalNumberOfNodes();
}

不幸的是,代码在不同的机器实例中不可靠。在测试中,它似乎有时会为相同的键返回不同的Node。

有什么想法或想法让事情更好地工作吗?

通过Hash函数对数据进行分区

你不应该依赖stringGetHashCode()的实现,除非相等的字符串会产生相同的哈希码——但是哈希码的特定值只需要与当前执行应用程序的文档保持一致——如果应用程序再次运行,可以返回不同的哈希码。

GetHashCode的实现也可能是不同的,如果你有不同的。net CLR版本的机器上的问题:

GetHashCode的行为依赖于它的实现可能会从公共语言运行时的一个版本更改为另一个地方。发生这种情况的一个原因是为了提高性能GetHashCode方法。

相反,你可以定义一个从字符串键到数字值的一致映射,这将允许你在重启和机器边界上一致地存放节点,这也就是说,可以通过将字符串转换为字节数组(即使用Encoding.UTF8.GetBytes()),然后将字节数组转换为数字(使用损耗转换仅使用64位或使用BigInteger)来实现

一个特定的实例(一个实例化的字符串)将生成相同的哈希值,但是同一个字符串的两个实例(比如在机器A和机器B上)(例如"Hello")很可能具有不同的hashCodes。如果你想在机器和实例之间进行相同的操作,我认为你需要实现自己的哈希函数,只使用字符串的内容。