"enemy1", "enemy2"
。{ { "enemy1", 0 }, { "enemy2", 1 } }
之类的字典。int hash_ = 0;
public override int GetHashCode()
{
if(hash_ == 0)
{
hash_ = 5381;
foreach(var ch in id_)
hash_ = ((hash_ << 5) + hash_) ^ ch;
}
return hash_;
}
因此,问题是:C#中的alg在任何机器播放器中都将返回相同的结果。
UPD:在评论中,我注意到问题的主要部分尚不清楚。
所以。如果我可以保证反序列化之前的所有文件都使用相同的编码,那么播放器可以使用的每台计算机上的char表示形式是否都相同,并且操作^ ch
会给出相同的结果吗?我的意思是WinX64 / WinX32 / Mac / Linux / ...机器
答案 0 :(得分:3)
是的,对于相同的输入,该代码将在每个平台上提供相同的结果。 char
是UTF-16代码单元,与平台无关,并且任何给定的char
将在每个平台上转换为相同的int
值。与使用这种方式计算的哈希码一样,您不应该假定相等的哈希码意味着相等的原始值。 (说实话,目前尚不清楚您打算如何使用哈希。)
我要指出的是,您的代码不是线程安全的-如果两个线程基本上同时调用GetHashCode
,则一个线程可能会看到0值(并因此开始进行哈希处理),而第二个线程可能会看到看到 interim 结果(由第一个线程计算),并假定这是最终的哈希值。如果您真的认为缓存在这里很重要(并且我会先进行测试),则应该使用局部变量来计算完整的哈希,然后仅在完成后将其复制到字段中。