2

この質問は、Ruby でシンボルをハッシュ キーとして使用するのはなぜですか?

ご覧のとおり、誰もがシンボルがハッシュ キーの最も論理的な選択であることに同意しています。ただし、sinatra フレームワークを使用して Web アプリケーションを構築しており、オブジェクトはs をキーとしてrequest含むハッシュです。Stringこれが設計上の選択である理由を誰か説明できますか?

4

1 に答える 1

4

キーのソース (クエリ文字列) は文字列で構成されているため、この文字列からキーを検索するには、文字列を介してハッシュにインデックスを付けるのが最も直接的に便利です。

Ruby ランタイムで作成されたすべてのシンボルは割り当てられ、解放されることはありません。一意のクエリ文字列パラメーターを使用して数十万の要求を送信することにより、理論的な (ただし可能性は低い) DOS 攻撃を利用できます。これらがシンボル化されている場合、各リクエストはランタイム メモリ プールをゆっくりと拡大します。

一方、文字列はガベージ コレクションの対象になる場合があります。さまざまなリクエストで処理される何千もの一意の文字列は、最終的にはなくなり、長期的な影響はありません。

編集: Sinatraでは、ハッシュへのアクセスにシンボルも使用できることに注意してください。paramsただし、これは、文字列によってインデックス付けされたハッシュを作成し、リクエストを行うときに (コード内の) シンボルを文字列に変換することによって行われます。次のようなことをしない限り:

params.each{ |key,_| key.to_sym }

...シンボル疑似 DOS 攻撃のリスクはありません。

于 2013-04-25T17:19:01.097 に答える