NUnit从ReSharper和Visual Studio 2013获得不同的哈希代码值

本文关键字:哈希 代码 ReSharper Visual 2013 Studio NUnit | 更新日期: 2023-09-27 18:36:52

根据Jon Skeet在这里的回答,我在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的测试资源管理器运行针对此方法的NUnit测试时,我得到一个哈希代码值,当我通过ReSharper 8的单元测试资源管理器运行它时,我得到一个不同的值。

这是我的单元测试代码:

[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() 返回的值在测试运行程序之间不同,如何使它们彼此一致?

NUnit从ReSharper和Visual Studio 2013获得不同的哈希代码值

你可能

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

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