dictionary - 为什么是字典.TryGetValue(TKey, TValue) 总是返回 true?
问题描述
我正在尝试使用Dictionary.TryGetValue()
在字典中搜索用户名和密码哈希,如果它匹配验证用户,如果不做其他事情。
我遇到的问题是,只要哈希值与字典中的内容不匹配,它就会返回 true,可能是因为它匹配了用户名键?如果只有键而不是该值匹配,是否预期行为会返回 true?
我在下面包含了我的方法和用户输出。我正在打印哈希以进行故障排除。
这是哈希匹配但不匹配的示例用户输出:
如果哈希第一次不匹配,它不会改变行为
密码认证系统
请选择一个选项:
- 建立账户
- 验证用户
- 退出系统
输入选择: 1 输入您的用户名:username
输入密码:用户名,5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8]
密码认证系统
请选择一个选项:
- 建立账户
- 验证用户
- 退出系统
输入选择:2 输入您要验证的用户名用户名:用户名
输入密码: 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8 用户名成功认证为
密码认证系统
请选择一个选项:
- 建立账户
- 验证用户
- 退出系统
输入选择:2 输入您要验证的用户名用户名:用户名
输入密码: 152f66d0fe3a409590ec40fea1ee037cefb4549a1f511defd16824117a768b1d 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8
成功认证为用户名
下面是认证方法
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
变量。
推荐阅读
- r - 叠加直方图和密度估计
- c++ - Libc hypot 函数似乎为 double 类型返回不正确的结果......为什么?
- python - 在 Python 中为机器学习模型总结具有多个值的特征
- c# - 两个不同类的扩展方法
- python - 在从 node/express/tedious 执行 python 脚本之前等待存储过程完全完成
- java - 用于 XML 的带有 CData JDBC 驱动程序的 OAuth - Google Drive 上的文件 - 未使用 CallbackURL
- carousel - 类活动以锚定旋转木马幻灯片
- reactjs - Want to navigate to first page on a button click
- c# - Xamarin ListView 和 ObservableCollection 最多显示 5 个数据
- xamarin.forms - Xamarin Forms DisplayPrompt 应用键盘渲染器