微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么Dictionary <TKey,TValue> .TryGetValueTKey,TValue总是返回true?

如何解决为什么Dictionary <TKey,TValue> .TryGetValueTKey,TValue总是返回true?

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

我遇到的问题是,只要哈希值与字典中的值不匹配,它就始终返回true,也许是因为它与用户名键匹配? 如果只有键而不是那个值匹配,是否期望行为返回true?

我在下面包括了我的方法用户输出。我正在打印哈希以进行故障排除。

以下是示例用户输出,其中哈希匹配,然后不匹配:

如果哈希第一次不匹配,则不会更改行为

密码验证系统

请选择一个选项:

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

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

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

密码验证系统

请选择一个选项:

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

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

输入密码: 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8 成功验证为用户名

密码验证系统

请选择一个选项:

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

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

输入密码: 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变量。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。