我正在尝试重载一个方法,该方法使用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);
}
这似乎是一个类型问题所以可能是显而易见的事情。
答案 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);