首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Dictionary<TKey,TValue>.TryGetValue(TKey,TValue)总是返回true?

为什么Dictionary<TKey,TValue>.TryGetValue(TKey,TValue)总是返回true?
EN

Stack Overflow用户
提问于 2020-09-10 18:25:55
回答 1查看 24关注 0票数 0

我试图使用Dictionary.TryGetValue()搜索字典中的用户名和密码哈希,如果它与验证用户的身份匹配,如果不执行其他操作的话。

我遇到的问题是,每当哈希值与字典中的内容不匹配时,它都会返回true,可能是因为它匹配用户名键吗?如果只有键(而不是该值)匹配,那么期望行为返回true吗?

我在下面包含了我的方法和用户输出。我正在打印散列以进行故障排除。

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

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

密码认证系统

请选择一个选项:

account

  • Authenticate a
  1. a
  2. 退出system

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

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

密码认证系统

请选择一个选项:

account

  • Authenticate a
  1. a
  2. 退出system

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

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

密码认证系统

请选择一个选项:

account

  • Authenticate a
  1. a
  2. 退出system

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

输入密码:152f66d0fe3a409590ec40fea1ee037cefb4549a1f511defd16824117a768b1d 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8

成功验证为用户名

下面是身份验证方法

代码语言:javascript
复制
        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);
            }
        }
EN

回答 1

Stack Overflow用户

发布于 2020-09-10 18:41:01

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63835644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档