- 最后登录
- 2016-10-1
- 注册时间
- 2013-12-28
- 阅读权限
- 90
- 积分
- 5805
- 纳金币
- 2954
- 精华
- 3
|
今天在项目里调试了一上午加一中午,之前在控制台版的测试客户端上一切正常,但是服务器端同步给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了。
|
|