纳金网
标题:
慎用C#的string.GetHashCode()
[打印本页]
作者:
刀锋狼
时间:
2014-4-30 03:43
标题:
慎用C#的string.GetHashCode()
今天在项目里调试了一上午加一中午,之前在控制台版的测试客户端上一切正常,但是服务器端同步给
unity
客户端的属性总是取不到,最后发现原因在string.GetHashCode()上,很是郁闷(由于是移动项目,出于流量控制方面的考虑,角色身上的属性是通过属性名的Hash值标记的)。
备注
GetHashCode 的行为取决于它的实现,此实现可能会从一个公共语言运行时版本更改为另一个版本。 原因可能是为了提高 GetHashCode 的性能。
说明说明
如果两个字符串对象相等,则 GetHashCode 方法返回相同的值。 但是,每个唯一的字符串值并没有唯一的哈希代码值。 不同的字符串可以返回相同的哈希代码。
有关哈希代码的更多信息,请参见 Object.GetHashCode。
对调用者的说明
GetHashCode 返回的值与平台相关。 在 32 位和 64 位版本的 .NET Framework 上有所不同。
——摘自MSDN http://msdn.microsoft.com/zh-cn/library/system.string.gethashcode.aspx
复制代码
网络层我们用的是.net 3.5,Unity是.net 2.0,所以导致了同一个string调用GetHashCode返回的值不一样。
最终的解决方案
public static class ParamIndex
{
private static Dictionary<string, int> storedParamName = new Dictionary<string, int>();
public static int getParamIndex(this string sParam)
{
if (storedParamName.ContainsKey(sParam))
{
return storedParamName[sParam];
}
int iCount = storedParamName.Count;
storedParamName.Add(sParam, iCount);
return iCount;
}
}
复制代码
通过C#的扩展方法实现了属性名的Index绝对唯一,只要将之前的GetHashCode方法直接替换为getParamIndex就OK了。
作者:
hyui
时间:
2014-4-30 03:58
Thank you for sharing! ) ) )
作者:
jarryVFX
时间:
2014-4-30 08:38
感谢无私分享
作者:
wucnj
时间:
2014-4-30 09:07
感谢分享!!!
欢迎光临 纳金网 (http://go.narkii.com/club/)
Powered by Discuz! X2.5