GUID必须是16个字节长

时间:2016-01-10 18:52:13

标签: c# overloading

我正在尝试重载一个方法,该方法使用Guid作为其参数,另一个方法以字符串作为参数。

    // read a student object from the dictionary
    static public User Retrieve(Guid ID)
    {
        User user;
        // find the Guid in the Dictionary
        user = Users[ID];
        return user;
    }

    static public User Retrieve(string Email)
    {
        User user;
        Guid id;
        // find the Guid in the Dictionary
        using (SHA1 sha1 = SHA1.Create())
        {
            byte[] hash = SHA1.ComputeHash(Encoding.Default.GetBytes(Email));
            id = new Guid(hash);
        }
        user = Users[id];
        return user;
    }

测试结果 结果消息: 测试方法SRS.CRUDUsers.UpdateStudent抛出异常: System.ArgumentException:GUID的字节数组必须正好是16个字节长。

测试方法:

    public void UpdateStudent()
    {
        // Arrange
        Student expected = (Student)UserRepo.Retrieve("info@info.com");

        // Act
        Student actual = (Student)UserRepo.Retrieve("info@info.com");
        actual.FirstName = "Joe";
        actual.LastName = "Brown";
        actual.Birthday = new DateTime(1977, 2, 23);
        actual.DegreeSelected = 1;

        // Assert (this is only really checking the object agains itself
        // because both variables are referencing the same object).
        Assert.IsNotNull(actual.ID);
        Console.WriteLine(actual.ID);
        Assert.AreEqual(expected.Name, actual.Name);
        Assert.AreEqual(expected.GetType(), actual.GetType());
        Assert.AreEqual(expected.Birthday, actual.Birthday);
        Assert.AreEqual(expected.Age, actual.Age);
    }

这似乎是一个类型问题所以可能是显而易见的事情。

2 个答案:

答案 0 :(得分:4)

来自wiki

  

SHA-1产生160位( 20字节

错误:

  

GUID的字节数组必须 16个字节长

所以你不能只使用SHA1作为Guid。如果这不是与安全相关的代码,您可以尝试MD5(它是128)。

答案 1 :(得分:0)

尝试以下

new Guid(hash.Take(16).ToArray())

或者你可以使用MD5哈希,因为它是一个16字节的哈希

var md5 = MD5.Create();
var hash = md5.ComputeHash(Encoding.Default.GetBytes(Email));
new Guid(hash);