【问题标题】:32-bit GetHashCode() on a 64-bit .NET 4.5 CLR [duplicate]64 位 .NET 4.5 CLR 上的 32 位 GetHashCode() [重复]
【发布时间】:2014-05-11 12:41:08
【问题描述】:

在 64 位 .NET 4.5 平台上,无论如何计算字符串的 GetHashCode() 方法在 32 位 .NET 4.5 平台上的结果是什么?

显然这不是一个好主意。 herehere 已对此进行了询问和解释。只有说明如何操作的答案才会被接受。

【问题讨论】:

  • 为什么想知道怎么做? GetHashCode() 仅对程序的一次运行(在单个应用程序域中)具有确定性。我看不出您的问题与您链接的两个问题有何不同,答案是“您不能”。
  • 应用程序运行的数据库需要它。这是原始开发人员的错误设计决定。知道这个问题的答案将是解决它的最简单方法。
  • 请不要编辑问题的答案。这个问题正在获得重新开放的投票。也许我自己也想这样投票。
  • 在阅读了这个被标记为重复的问题之后,我很难看到那里接受的答案如何没有回答这个问题,只是附加信息没有基于是否有区别它运行 64/32 位。
  • 同意,“重复问题”的答案之一确实回答了这个问题。然而,这是一个不同的问题,证据在于这个问题的潜在答案不能回答另一个问题,反之亦然。想象一下,有一组构建标志会导致 64 位像 32 位一样运行。那将回答这个问题,但不能回答另一个问题。 .NET 5 或 7 中的 GetHashCode 函数如何回答另一个问题,但不回答这个问题。

标签: c# .net string hashcode gethashcode


【解决方案1】:

GetHashCode() 既不是 32 位也不是 64 位特定的,因此在 32 位系统上调用它与在 64 位系统上调用它是一样的。

您似乎正试图将哈希码重用于某种序列化目的。你不能可靠地做到这一点。如果它更容易,可以将字符串的GetHashCode() 函数视为如下。

static Dictionary <string, int> HashCodes = new Dictionary<string, int>();
static Random Rand = new Random();

static int PsudoGetHashCode(string stringInQuestion)
{
    lock(HashCodes)
    {
        int result;
        if(!HashCodes.TryGetValue(stringInQuestion, out result)
        {
            result = Rand.Next();
            HashCodes[stringInQuestion] = result;
        }

        return result;
    }
}

您只能保证每次运行程序都会为相同的字符串获得相同的GetHashCode() 值,如果您关闭程序并重新打开它,您很可能会获得一个新值。

您唯一能给您提供可靠结果的解决方案是修复您的数据库设计,使其不存储来自 .NET 的内置 GetHashCode()

【讨论】:

    猜你喜欢
    • 2017-04-30
    • 2011-09-06
    • 1970-01-01
    • 2010-10-12
    • 2013-04-15
    • 1970-01-01
    • 2018-11-10
    • 2012-10-26
    • 1970-01-01
    相关资源
    最近更新 更多