.net Guid.GetHashCode()是否会使用不同的AppDomain返回不同的值?

.net Guid.GetHashCode()是否会使用不同的AppDomain返回不同的值?,.net,hash,.net,Hash,根据MSDN: 相同字符串的String.GetHashCode()可能因以下原因而不同: 不同版本的.NET Framework 不同的平台(如32位和64位) 甚至不同的应用程序域 Guid.GetHashCode()如何?在上述三种情况下会发生变化吗 我检查了2的Guid.GetHashCode()是否返回不同的值 使现代化 如何理解3关于String.GetHashCode()的内容?假设我运行同一个应用程序两次,肯定有两个不同的应用程序域。但正如我所尝试的,只要目标平台不变,哈希代码总

根据MSDN:

相同字符串的String.GetHashCode()可能因以下原因而不同:

  • 不同版本的.NET Framework

  • 不同的平台(如32位和64位)

  • 甚至不同的应用程序域

  • Guid.GetHashCode()如何?在上述三种情况下会发生变化吗

    我检查了2的Guid.GetHashCode()是否返回不同的值

    使现代化 如何理解3关于String.GetHashCode()的内容?假设我运行同一个应用程序两次,肯定有两个不同的应用程序域。但正如我所尝试的,只要目标平台不变,哈希代码总是相同的。例如,“hello,world”.GetHashCode()

    那么什么时候会发生3次?

    以下是我的一些问题背景:

    我的服务器应用程序从客户端接收一些guid。每个客户端的GUID都是唯一的。我想将客户机分配到不同的存储桶。我需要保持客户机bucket映射固定。有很多客户端,所以我无法将所有看到的客户端都保存在内存中

    我目前的解决办法是:

  • 获取客户端GUID的哈希代码(GUID或GUID字符串,尚未确定)
  • 使用(哈希代码%bucket total number)作为bucket索引

  • 我必须确保特定客户端的哈希代码保持不变。

    继承自
    系统的
    GetHashCode
    方法。对象
    随以下消息一起出现:

    哈希代码用于在基于哈希表的集合中高效插入和查找。哈希代码不是永久值。因此:
    *不要序列化哈希代码值或将其存储在数据库中。
    *不要使用哈希代码作为键从键控集合检索对象。
    *不要跨应用程序域或进程发送哈希代码。在某些情况下,散列码可以基于每个进程或每个应用程序域进行计算。
    *如果需要加密强散列,请不要使用散列代码而不是加密散列函数返回的值。对于加密哈希,请使用从System.Security.Cryptography.HashAlgorithm或System.Security.Cryptography.KeyedHashAlgorithm类派生的类。
    *不要测试散列码是否相等,以确定两个对象是否相等。(不相等的对象可以有相同的哈希代码。)要测试相等性,请调用ReferenceEquals或Equals方法

    (我的重点)

    因此,无论它当前是否返回不同的值,您都应该假设它可以

    关于你的3个具体案例,答案如下:

  • 可能
  • 可能
  • 可能
  • 这就是重点

    简言之,如果您的字符串、guid或其他任何东西需要一个可靠的hashcode实现,该实现可以持久化,并且不会受到所列内容(或您无法控制的其他内容)的影响,那么您需要自己实现它


    您可以实现,大多数使用hashcodes进行键控的.NET集合都可以提供一个实现该接口的自定义对象,因此您甚至可以为这些集合提供自己的hashcode实现。

    系统继承的
    GetHashCode方法。object
    包含以下消息:

    哈希代码用于在基于哈希表的集合中高效插入和查找。哈希代码不是永久值。因此:
    *不要序列化哈希代码值或将其存储在数据库中。
    *不要使用哈希代码作为键从键控集合检索对象。
    *不要跨应用程序域或进程发送哈希代码。在某些情况下,散列码可以基于每个进程或每个应用程序域进行计算。
    *如果需要加密强散列,请不要使用散列代码而不是加密散列函数返回的值。对于加密哈希,请使用从System.Security.Cryptography.HashAlgorithm或System.Security.Cryptography.KeyedHashAlgorithm类派生的类。
    *不要测试散列码是否相等,以确定两个对象是否相等。(不相等的对象可以有相同的哈希代码。)要测试相等性,请调用ReferenceEquals或Equals方法

    (我的重点)

    因此,无论它当前是否返回不同的值,您都应该假设它可以

    关于你的3个具体案例,答案如下:

  • 可能
  • 可能
  • 可能
  • 这就是重点

    简言之,如果您的字符串、guid或其他任何东西需要一个可靠的hashcode实现,该实现可以持久化,并且不会受到所列内容(或您无法控制的其他内容)的影响,那么您需要自己实现它


    您可以实现,大多数使用哈希代码进行键控的.NET集合都可以提供一个实现该接口的自定义对象,因此您甚至可以为这些接口提供自己的哈希代码实现。

    的文档非常简单;它没有定义如何计算哈希代码。因此,您应该假设Object.GetHashCode的所有警告都适用。

    的文档非常简单;它没有定义如何计算哈希代码。因此,您应该假设Object.GetHashCode的所有警告都适用。

    其他答案完全正确-因为它没有文档记录,所以您不应该依赖GUID的哈希代码在多个应用程序域中保持一致

    这就是说,为了满足无聊的好奇心,这里使用了(from)的实现,它实际上似乎是一个只使用
    public override int GetHashCode()
    {
        return _a ^ (((int)_b << 16) | (int)(ushort)_c) ^ (((int)_f << 24) | _k);
    }