纳金网

标题: 慎用C#的string.GetHashCode() [打印本页]

作者: 刀锋狼    时间: 2014-4-30 03:43
标题: 慎用C#的string.GetHashCode()
今天在项目里调试了一上午加一中午,之前在控制台版的测试客户端上一切正常,但是服务器端同步给unity客户端的属性总是取不到,最后发现原因在string.GetHashCode()上,很是郁闷(由于是移动项目,出于流量控制方面的考虑,角色身上的属性是通过属性名的Hash值标记的)。
  1. 备注
  2. GetHashCode 的行为取决于它的实现,此实现可能会从一个公共语言运行时版本更改为另一个版本。 原因可能是为了提高 GetHashCode 的性能。
  3. 说明说明
  4. 如果两个字符串对象相等,则 GetHashCode 方法返回相同的值。 但是,每个唯一的字符串值并没有唯一的哈希代码值。 不同的字符串可以返回相同的哈希代码。
  5. 有关哈希代码的更多信息,请参见 Object.GetHashCode。
  6. 对调用者的说明
  7. GetHashCode 返回的值与平台相关。 在 32 位和 64 位版本的 .NET Framework 上有所不同。
  8. ——摘自MSDN http://msdn.microsoft.com/zh-cn/library/system.string.gethashcode.aspx
复制代码
网络层我们用的是.net 3.5,Unity是.net 2.0,所以导致了同一个string调用GetHashCode返回的值不一样。

最终的解决方案
  1. public static class ParamIndex
  2. {
  3.         private static Dictionary<string, int> storedParamName = new Dictionary<string, int>();
  4.         public static int getParamIndex(this string sParam)
  5.         {
  6.                 if (storedParamName.ContainsKey(sParam))
  7.                 {
  8.                         return storedParamName[sParam];
  9.                 }
  10.                 int iCount = storedParamName.Count;
  11.                 storedParamName.Add(sParam, iCount);
  12.                 return iCount;
  13.         }

  14. }
复制代码
通过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