为什么词典<啦,电视>。TryGetValue(TKey, TValue) 总是返回 true?



我正在尝试使用Dictionary.TryGetValue()在字典中搜索用户名和密码哈希,如果它匹配,则对用户进行身份验证,如果不匹配,则执行其他操作。

我遇到的问题是,只要哈希值与字典中的不匹配,它就会返回true,可能是因为它与用户名密钥匹配?如果只匹配键而不匹配该值,那么预期行为是否返回true?

我在下面包含了我的方法和用户输出。我打印哈希是为了排除故障。

以下是散列匹配但不匹配的示例用户输出:

如果哈希第一次不匹配,它不会改变行为

密码认证系统

请选择一个选项:

  1. 建立帐户
  2. 对用户进行身份验证
  3. 退出系统

输入选择:1输入您的用户名:用户名

输入密码:用户名,5e884898da28047151d0e56f8dc62927736030d6abbdd62a11ef721d1542d8]

密码认证系统

请选择一个选项:

  1. 建立帐户
  2. 对用户进行身份验证
  3. 退出系统

输入选择:2输入要验证的用户名用户名:用户名

输入密码:5e884898da28047151d0e56f8dc62927736030d6abbdd62a11ef721d1542d85e 884898da2 8047151d0 e56f8Dc62927730030d6abdd62a11ef 721d1542d 8

密码认证系统

请选择一个选项:

  1. 建立帐户
  2. 对用户进行身份验证
  3. 退出系统

输入选择:2输入要验证的用户名用户名:用户名

输入密码:152f66d0fe309590ec40fea1ee037cefb4549a1f511defd16824117a768b1d5e884898da28047151d0e56f8dc62927736030d6abdd62a11ef721d1542d8

成功验证为用户名

以下是身份验证方法

static void authUser(string userName)
{
if (!passDB.ContainsKey(userName))
Console.WriteLine($"Username "{userName}" does not exist.");
else if (passDB.ContainsKey(userName))
{
string secret;
string testHash;
int tryCount = 4;
do
{
secret = HidePassInput();
SHA256 sha256Hash = SHA256.Create();
testHash = GetHash(sha256Hash, secret);
Console.WriteLine(testHash);
if (passDB.TryGetValue(userName, out testHash))
{
Console.WriteLine(testHash);
Console.WriteLine($"Successfully authenticated as {userName}n");
tryCount = 0;
}
else
{
tryCount--;
Console.WriteLine($"Failed to autheticate as {userName}. {tryCount} more tries left.n");
}

} while (tryCount > 0);
}
}

您似乎误解了TryGetValue方法的使用。

第一个参数是要获取其值的键。第二个参数是out参数。如果键存在,它的值将被分配给您用作out参数参数的变量。testHash所保持的任何值都被覆盖。

TryGetValue没有收到您要查找的值。它只接收一个密钥。如果找到该键,则返回true,否则返回false。找到的关键字的值被分配给out变量。

最新更新