2011-07-14 18 views
0

我需要跨N个节点的分布式缓存平分数据。分区数据的Hash函数

下面的代码将采取缓存键和确定使用哪个节点:

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

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

上得到的东西更好地工作,任何想法或意见?

+0

所以你声称的'key'的按位相同的值,你会得到不同的函数结果? – 2011-07-14 03:55:15

+0

它是什么我目前怀疑的是我通过 –

+1

可能重复工作的问题[GetHashCode()方法提供了不同的服务器上不同的结果?](http://stackoverflow.com/questions/6114772/gethashcode-gives-不同-成果上不同的服务器) –

回答

3

除了相等值的字符串会产生相同的哈希码这一事实之外,您不应该依赖于stringGetHashCode()的实现 - 但是哈希码的特定值将只需要与每documentation用于应用的当前执行 - 可以应用程序是否再次运行返回不同的散列码。

同样的GetHashCodemight be different实施,如果你有问题的机器上不同的.NET CLR版本:

的GetHashCode的行为取决于它的实现,这 可能会从普通的一个版本中改变语言运行时到 另一个。这可能发生的原因是为了提高GetHashCode的性能 。

相反,你可以只定义从您的字符串键始终映射成一个数值,这将让你斌您的跨重新启动和机器边界一致的节点,这即可以由字符串转换成字节数组实现(即使用Encoding.UTF8.GetBytes()),然后将字节数组转换为数字(使用仅使用64位的有损转换或即使用BigInteger

+0

我读这上运行的Web角色的两个实例,但我遇到了在Azure的开发环境这个问题(同一web.role的两个实例) –

+0

@Andrew:你自己定义一个映射到你的字符串键的数字值不应该太难,总会有冲突,但你必须能够保证相同的字符串值将始终映射到同一个bin – BrokenGlass

2

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