C# 利用散列函数对数据进行分区

C# 利用散列函数对数据进行分区,c#,C#,我需要在分布式缓存中跨n个节点平均分割数据 以下代码将获取缓存密钥并确定要使用的节点: public static int GetNodeIDByCacheKey(string key) { return Math.Abs(key.GetHashCode()) % TotalNumberOfNodes(); } 不幸的是,代码在不同的机器实例之间并不可靠。 在测试中,它似乎有时会为同一个键返回不同的节点 关于如何让某些东西更好地工作,您有什么想法或想法吗?您不应该依赖字符串的GetHa

我需要在分布式缓存中跨n个节点平均分割数据

以下代码将获取缓存密钥并确定要使用的节点:

public static int GetNodeIDByCacheKey(string key)
{
    return Math.Abs(key.GetHashCode()) % TotalNumberOfNodes();
}
不幸的是,代码在不同的机器实例之间并不可靠。 在测试中,它似乎有时会为同一个键返回不同的节点


关于如何让某些东西更好地工作,您有什么想法或想法吗?

您不应该依赖字符串的GetHashCode的实现,除了值相等的字符串将生成相同的哈希代码这一事实之外,但是哈希代码的特定值只需要与当前执行的应用程序-如果再次运行应用程序,则可以返回不同的哈希代码

如果您在所讨论的计算机上有不同的.NET CLR版本,则还应说明GetHashCode的实现:

GetHashCode的行为取决于它的实现,而 可能从公共语言运行库的一个版本更改为 另一个出现这种情况的原因之一是为了提高性能 GetHashCode的一部分


相反,您可以定义从字符串键到数值的一致映射,这将允许您跨重启和机器边界一致地存储节点,这可以通过将字符串转换为字节数组来实现,即使用Encoding.UTF8.GetBytes,然后使用仅使用64位的有损转换或使用BigInteger将字节数组转换为数字。除了字符串值相等之外,您不应该依赖字符串的GetHashCode实现将生成相同的哈希代码-但哈希代码的特定值仅需要与应用程序当前执行的一致-如果应用程序再次运行,则可以返回不同的哈希代码

如果您在所讨论的计算机上有不同的.NET CLR版本,则还应说明GetHashCode的实现:

GetHashCode的行为取决于它的实现,而 可能从公共语言运行库的一个版本更改为 另一个出现这种情况的原因之一是为了提高性能 GetHashCode的一部分


相反,您可以定义从字符串键到数值的一致映射,这将允许您跨重启和机器边界一致地存储节点,这也就是说,可以通过将字符串转换为字节数组,即使用Encoding.UTF8.GetBytes,然后使用仅使用64位的有损转换或使用BigInteger将字节数组转换为数字来实现。一个特定实例实例化的字符串将生成相同的哈希,但是两个实例,比如机器A和机器B上的同一字符串Hello,很可能有不同的hashcode。我认为,如果希望在计算机和实例之间执行相同的操作,则需要实现自己的哈希函数,该函数只使用字符串的内容。

特定实例实例化的字符串将生成相同的哈希,但是两个实例,比如机器A和机器B上的同一字符串Hello,很可能有不同的hashcode。我认为,如果希望在计算机和实例之间执行相同的操作,则需要实现自己的哈希函数,该函数只使用字符串的内容。

因此,您声明,对于按位相同的密钥值,你得到了不同的函数结果?我目前怀疑的是我正在处理的问题可能是更多信息的重复:这发生在Azure开发中,两个web角色实例在同一台计算机上运行,因此你声称对于按位相同的密钥值,你得到了不同的功能结果?我目前怀疑的是我正在处理的问题可能是更多信息的重复:这发生在Azure开发中,两个web角色实例在同一台计算机上运行我读到了这篇文章,但是我在Azure开发环境中遇到了这个问题,同一个web的两个实例。role@Andrew:为您的字符串键自己定义到数值的映射应该不太难,总会有冲突,但您必须能够保证相同的字符串值始终映射到相同的binI读取此,但是我在Azure开发环境中遇到了这个问题,同一个web的两个实例。role@Andrew:为您的字符串键自己定义到数值的映射应该不会太难,始终会有冲突,但您必须能够保证相同的字符串值始终映射到相同的bin