【问题标题】:NUnit Gets Different Hash Code Values from ReSharper vs Visual Studio 2013NUnit 从 ReSharper 与 Visual Studio 2013 获取不同的哈希码值
【发布时间】:2015-01-08 19:32:40
【问题描述】:

根据 Jon Skeet 的回答 here,我在 C# 中有一个相当简单的 GetHashCode() 实现。这是我的代码:

public override int GetHashCode()
{
    unchecked
    {
        int hash = 17;
        if (Title != null)
        {
            hash = hash * 23 + Title.GetHashCode(); // Title is of type string
        }
        return hash;
    }
}

当我通过 Visual Studio 2013 的 Test Explorer 运行针对此方法的 NUnit 测试时,我得到一个哈希码值,当我通过 ReSharper 8 的 Unit Test Explorer 运行它时> 我得到了不同的价值。

这是我的单元测试代码:

[Test]
public void GetGetHashCode_WithLinkAndTitle()
{
    const int expected = -1272954771;
    var target = new Article
    {
        Title = "Rumble News"
    };
    var actual = target.GetHashCode();
    Assert.AreEqual(expected, actual);
}

从 VS 2013 我得到实际 == -1411317427,从 ReSharper 我得到实际 == -1272954771。

为什么从 GetHasCode() 返回的值在不同的测试运行器之间存在差异,我怎样才能使它们彼此一致?

【问题讨论】:

  • 你看到的值是什么,Title中的字符串是什么,Title的hashcode是什么?
  • 谢谢@PatrickQuirk。我在问题正文中添加了详细信息。
  • 在对GetHashCode 进行单元测试时,您应该只验证在两个相等的对象上调用它会返回相同的值。这样您就可以在不中断测试的情况下更改实现。

标签: c# unit-testing visual-studio-2013 resharper


【解决方案1】:

您可能在一个测试运行程序中使用 32 位 CLR,而在另一个测试运行程序中使用 64 位 CLR。 string.GetHashCode 的实现在两者之间有所不同。您应该依赖它们在运行之间保持一致 - 它们只需要在单个进程中保持一致。

GetHashCode 方法从类初始化时随机初始化的静态字段中获取种子是完全合理的。因此,每次运行可执行文件时,您都会得到一组不同的哈希码 - 但它们会在单个应用程序域内仍然保持一致。)

【讨论】:

  • 谢谢@jon-skeet。奇怪的是,我确实尝试将 ReSharper 从 32 位切换到 64 位,但结果总是-1272954771。还有一个关于随机种子的问题——你如何对其进行单元测试?
  • @urig:基本上我不会对特定值进行单元测试。测试你真正想要的——相等的对象给出相同的哈希码,不相等的对象给出不同的哈希码。即使这样也有点脆弱,因为不相等的值给出相同的哈希码而不表示错误是可行的 - 但它不太可能。
猜你喜欢
  • 1970-01-01
  • 2013-11-12
  • 2019-05-08
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
  • 2017-09-10
  • 2018-03-06
相关资源
最近更新 更多