我有几个关于客户端服务器模型的问题。我当前的应用程序(或者更确切地说是我提议的应用程序)使用中央服务器,不同的客户端可以连接到它。
(对于想要回答问题但不知道的人的 O(n) 的小解释,无论是谷歌还是按照这个例子:
考虑一个包含 n 个元素的列表。O(1) 意味着您可以只选择元素,而 O(n) 基本上意味着您可能必须遍历每个元素(因此 n 个元素)才能获得所需的项目。O(log n) 是一种与递归细分有关的中间方法,它仍然比 O(n) 快很多,但没有 O(1) 快。)
问题一:
我如何有效地检索用户记录,我不知道服务器在某个时候必须处理多少用户,但我坚信如果 O(1) 可以合理实施,O(n) 操作是不够的。
第一部分是关于登录过程,我打算让用户使用个人标识符(用户名/电子邮件/等)和密码登录,一旦有人尝试登录,此信息就会发送到服务器。
此外,我还计划不直接使用数据库(例如 MySQL),而纯粹出于“备份”目的(如果可能,服务器应将所有信息存储在 RAM 中,并且仅将其写入数据库,以便在通电时不会丢失任何信息丢失的)。
所以基本上服务器需要存储客户端数据(包括个人标识符,还有一个唯一的ID)。
我目前的想法:
存储在列表中,但是搜索用户(然后验证他的信息)可能需要 O(n) 时间,具体取决于排序,如果我对用户名进行字母排序,我可以将其减少到 O(log n) .
第二个建议是将其存储在 Client[] 数组中,并将 UniqueID 作为键。然后在 O(1) 中访问应该是可能的,这是理想的,但是我使用这种方法遇到的问题是如何将用户放入并发送到服务器的个人标识符(用户名等)转换为他的唯一身份?如果我使用 List 之类的东西,那么时间将再次变为 O(n)。此外,数组大小可能不会不成比例地巨大,因为它只会分配太多内存,例如,我不认为散列用户名是理想的,我也不确定它是否会创建一个唯一的 ID。
问题2:
其次,我当然也希望我的用户数据是安全的。现在假设底层 MySQL 服务器(数据在启动时从它加载到服务器的 RAM 中)是安全的。
然后我想知道在这些条件下保存的密码(当然是加密的)是否也安全?
没有任何东西可以直接物理访问服务器。
通信协议没有检索密码信息的命令或包含密码信息的超集,这意味着服务器在任何情况下都不会给出密码。
密码作为私有变量存储在服务器 RAM 中的客户端对象中。
要检查用户输入的信息是否正确,Client 对象具有类似
client.confirmPassword(password)
.
因此,除非我忘记了事情,否则问题基本上归结为服务器的 RAM 是否可以直接读取,因为它仅通过通信协议连接到外部世界?
帖子结果很长,但我希望周围有人可以回答这些问题:)