查看: 4597|回复: 3
打印 上一主题 下一主题

[其他] 慎用C#的string.GetHashCode()

[复制链接]

711

主题

10

听众

5805

积分

高级设计师

Rank: 6Rank: 6

纳金币
2954
精华
3

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2014-4-30 03:43:20 |只看该作者 |倒序浏览
今天在项目里调试了一上午加一中午,之前在控制台版的测试客户端上一切正常,但是服务器端同步给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了。
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

hyui    

1

主题

2

听众

6671

积分

高级设计师

Rank: 6Rank: 6

纳金币
2715
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2014-4-30 03:58:17 |只看该作者
Thank you for sharing! ) ) )
回复

使用道具 举报

0

主题

1

听众

146

积分

设计实习生

Rank: 2

纳金币
0
精华
0

最佳新人

板凳
发表于 2014-4-30 08:38:55 |只看该作者
感谢无私分享
回复

使用道具 举报

wucnj    

1

主题

1

听众

3160

积分

中级设计师

Rank: 5Rank: 5

纳金币
1065
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

地板
发表于 2014-4-30 09:07:29 |只看该作者
感谢分享!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-14 21:26 , Processed in 0.247621 second(s), 27 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部