c++ 这两种使用hashmaps的方法哪种更好?

oiopk7p5  于 2023-06-25  发布在  其他
关注(0)|答案(5)|浏览(148)

方法1:此方法使用整数**account_num在hashmap中查找用户。然后,它遍历与该账号关联的用户列表,以验证输入的密码。如果登录成功,它将返回用户对象的地址。主要问题是它试图返回局部变量的地址,这可能导致未定义的行为。此外,如果hashmap中不存在account_num**,也没有明确的反馈。

User* login() 
{   
    bool correct_id= false;
    User* user= nullptr;
    while (correct_id == false)
    {
        cout<<"Enter email"<<endl;
        int account_num;
        cin>> account_num;
        cout<<"Enter password"<<endl;
        string password;
        cin>> password;
        if (this->hashmap.find(account_num)!=this->hashmap.end())
        {
            for(User user_node: hashmap[account_num])
            {
                if(account_num==user_node.account_num && password==user_node.password)
                {
                    cout<<"Login successful, loading menu";
                    user= &user_node;
                    correct_id = true;
                }
            }
            return user;
        }
    }
}

方法二:该方法使用用户的**email**作为键直接访问hashmap。然后检查输入的密码是否与该电子邮件存储的密码匹配。如果登录成功,它将返回散列表中用户对象的地址。如果电子邮件不存在或密码不正确,它会提供明确的反馈。

User* Login()
{
    bool correct_id = false;
    User* user = nullptr;
    while(!correct_id)
    {
        string email,password;
        cout<<"Enter Your Email"<<endl;
        cin>>email;
        cout<<"Enter Your Password"<<endl;
        cin>>password;
        if(this->hashmap.find(email)!=this->hashmap.end())
        {
            User* user_ptr= this->hashmap[email];
            if(user_ptr->password==password)
            {
                cout<<"Login Successful,Loading Menu";
                user = user_ptr;
                correct_id = true;
            }
            else
            {
                cout<<"incorrect password. Try Again";
            }
        }
        else
        {
            cout<<"Email Not Found. Try Again";
        }
    }
    return user;
}

我只想知道哪种方法更好。

vcirk6k6

vcirk6k61#

C++中用户登录函数的第二种方法使用用户的电子邮件作为唯一标识符。它提供直接访问存储在无序Map(hashmap)中的用户数据,使用电子邮件作为密钥。由于哈希Map的访问时间复杂度为O(1),因此这种方法是有效的。
一旦电子邮件或密码输入不正确,则通知用户并要求用户重试,从而提供更好的用户体验。当登录成功时,它返回一个指向用户对象的指针,通过引用散列表中的现有对象而不是临时或本地对象来确保正确的内存管理。
虽然这种方法以纯文本形式处理密码,这是不安全的,但它通过散列密码为安全增强提供了清晰的途径。总的来说,与第一种方法相比,这是一种更传统、更高效、更友好的方法。它与用户身份验证系统的常见行业实践紧密一致,避免了潜在的内存管理问题。

4jb9z9bj

4jb9z9bj2#

嗯,我专攻JavaScript,但我会尝试一下。答案是这取决于程序的细节,我假设这是来自家庭作业练习。您应该发布散列表定义以便更好地理解。
在内存、可访问性和语法方面,第一个更好。我在银行工作过,想不起来有任何系统使用电子邮件地址作为Map键。
这两个函数都有2个搜索(如果或在第一个,为),这让我相信这是一个包含另一个数据结构的散列表。
在这种情况下,第二个是错误的。语法不起作用。您尝试首先访问索引,然后访问其中的内容。但是索引里面的东西不是这个->hashmap[email]。通过编写User *user_ptr = this->hashmap[email],您将创建一个指向索引本身的指针,而不是指向其中的任何数据结构。
我不想重复我自己,但是如果没有散列表定义,你的答案基本上是无法回答的。

cczfrluj

cczfrluj3#

hashmap的类型是什么,它是一个无序的map还是一个自定义的struct?
两个都是业余的,但我想你是初学者。
从第一个,我可以推断出这是某种嵌套的散列表,它不是典型的键,值散列表。如果是这样的话,第一个更好。
第一个更好,因为第二个有一个明显的语法问题。hashmap.find(email)可以搜索索引,但是在后面的一行中,你再次将指针赋值给索引,这是错误的。你应该把指针分配给任何东西(USER?)在索引内,而不是索引本身。
这些代码是如此不同,我甚至不能告诉他们是否使用相同的散列表。是吗?如果是,那么第二个就错了。

cvxl0en2

cvxl0en24#

这两段代码都是二年级的,尽管第二段包含的错误比第一段多。
你对第一个返回局部变量地址的代码的注解是错误的。它不返回局部变量的地址,而是返回hashmap变量的地址,该地址存储在函数外部。
user_node复制User对象,然后将地址存储到user_node,然后将其分配给指针user。因此指针user指向的对象超出了login函数。
用户指针和它指向的地址扩展到函数范围之外,即使user_node变量没有扩展到函数范围之外。所以它返回哈希图中一个有效对象的地址,而不是像你说的那样返回局部变量的地址。
第二个代码有语法问题,hashmap搜索没有意义。为什么要返回指向hashmap索引的指针?您需要返回指向User对象的指针,而不是索引。通过电子邮件地址搜索散列表是很尴尬的,更不用说随之而来的安全问题了。
总的来说,第一个代码应该得到B,第二个代码应该得到F。

rqqzpn5f

rqqzpn5f5#

第二种方法看起来更专业,更节省时间:几个原因:1.错误处理:代码通过检查电子邮件是否存在并通知用户密码不正确或未找到电子邮件来处理不同的错误情况。2.用户体验:它通过显示清晰的消息并允许用户更正其输入来提供用户友好的体验。3.Robustness:该代码使用循环反复提示用户,直到输入正确的电子邮件和密码,防止意外登录或未经授权的访问。4.安全性(基本):虽然缺乏高级安全措施,但该代码通过比较用户输入密码与存储密码,演示了一种简单的基于密码的身份验证机制。

相关问题