クライアント サーバー モデルに関していくつか質問があります。私の現在のアプリケーション (または私が提案したアプリケーション) は中央サーバーを使用しており、さまざまなクライアントがそれに接続できます。
(質問に答えたいが、それについて知らない人のための O(n) の簡単な説明。Google で検索するか、次の例に従ってください。
n 個の要素を持つリストを考えてみましょう。O(1) は要素を選択するだけでよいことを意味し、O(n) は基本的に、必要なアイテムを取得するためにすべての要素 (したがって n 要素) を反復処理する必要があることを意味します。そして、O(log n) は、再帰的な細分化を行う必要がある中間の方法であり、O(n) よりもはるかに高速ですが、O(1) ほど高速ではありません。)
質問1:
ユーザーのレコードを効率的に取得するにはどうすればよいですか。ある時点でサーバーが何人のユーザーを処理する必要があるかはわかりませんが、O(1) を実装するのが合理的である場合、O(n) 操作だけでは不十分であると強く信じています。
最初の部分はログイン手順についてです。ユーザーが個人識別子 (ユーザー名/電子メール/など) とパスワードを使用してログインできるようにする予定です。この情報は、誰かがログインしようとするとサーバーに送信されます。
さらに、データベース(MySQLなど)を直接使用するのではなく、純粋に「バックアップ」の目的で使用する予定です(サーバーは、可能であればすべての情報をRAMに保存し、電源が入ったときに何も失われないようにデータベースにのみ書き込む必要があります失った)。
したがって、基本的にサーバーはクライアント データ (個人識別子だけでなく一意の ID も含む) を保存する必要があります。
私の現在のアイデア:
リストに保存しますが、ユーザーの検索 (およびその情報の検証) には、並べ替えに応じて O(n) 時間がかかる場合があります。ユーザー名でアルファベット順の並べ替えを行うと、O(log n) に削減できます。 .
2 番目の提案は、UniqueID をキーとして Client[] 配列に格納することです。次に、O(1)でのアクセスが可能になるはずですが、これは理想的ですが、そのアプローチで私が抱えている問題は、ユーザーが入力してサーバーに送信する個人識別子(ユーザー名など)をどのように変換するかです.一意のID?リストのようなものを使用すると、時間は再び O(n) になります。さらに、配列のサイズが不均衡に大きくなることはありません。たとえば、ユーザー名のハッシュが理想的だとは思いませんし、一意の ID が作成されるかどうかもわかりません。
質問2:
第二に、もちろんユーザーデータも安全にしたいです。ここで、基礎となる MySQL サーバー (起動時にデータがサーバーの RAM にロードされる) が安全であると仮定します。
それでは、これらの条件を考えると、保存されたパスワード (もちろん暗号化されています) も安全なのでしょうか?
サーバーに直接物理的にアクセスできるものはありません。
通信プロトコルには、パスワード情報またはパスワード情報を含むスーパーセットを取得するためのコマンドがありません。つまり、サーバーはいかなる状況下でもパスワードを提供しません。
パスワードは、サーバーの RAM にある Client オブジェクトにプライベート変数として保存されます。
ユーザーが入力した情報が正しいかどうかを確認するために、 Client オブジェクトには のような関数があります
client.confirmPassword(password)
。
忘れていない限り、通信プロトコルを介してのみ外部の世界に接続されているサーバーの RAM を直接読み取ることができるかという問題が基本的に解決されますか?
投稿はかなり長いことが判明しましたが、これらの質問に答えてくれる人が周りにいることを願っています:)