比较不同机器上的字符串哈希

时间:2019-01-22 08:37:16

标签: c# hash char compare

  • 我有一堆字符串形式的ID,例如"enemy1", "enemy2"
  • 我要保存进度,取决于我杀死的每个敌人的数量。为此,我使用了{ { "enemy1", 0 }, { "enemy2", 1 } }之类的字典。
  • 然后,我想在玩家可以通过网络播放的几台计算机(例如PC和笔记本电脑)之间共享播放器的保存(首先在JSON文件中序列化)。为了减小大小和提高性能,我使用哈希代替了完整字符串,并使用了该算法(因为MDSN表示,默认哈希算法在不同机器上可能不同):
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 / ...机器

1 个答案:

答案 0 :(得分:3)

是的,对于相同的输入,该代码将在每个平台上提供相同的结果。 char是UTF-16代码单元,与平台无关,并且任何给定的char将在每个平台上转换为相同的int值。与使用这种方式计算的哈希码一样,您不应该假定相等的哈希码意味着相等的原始值。 (说实话,目前尚不清楚您打算如何使用哈希。)

我要指出的是,您的代码不是线程安全的-如果两个线程基本上同时调用GetHashCode,则一个线程可能会看到0值(并因此开始进行哈希处理),而第二个线程可能会看到看到 interim 结果(由第一个线程计算),并假定这是最终的哈希值。如果您真的认为缓存在这里很重要(并且我会先进行测试),则应该使用局部变量来计算完整的哈希,然后仅在完成后将其复制到字段中。