キーが小文字のアルファベット 1 文字(a,b,…,z のいずれか)であるデータを,大きさが 10 のハッシュ表に格納する。ハッシュ関数として,アルファベットの ASCII コードを 10 進表記法で表したときの 1 の位の数を用いることにする。衝突が起こるキーの組合せはどれか。ASCII コードでは,昇順に連続した 2 進数が,アルファベット順にコードとして割り当てられている。
- ア a と i
- イ b と r
- ウ c と l
- エ d と x
キーが小文字のアルファベット 1 文字(a,b,…,z のいずれか)であるデータを,大きさが 10 のハッシュ表に格納する。ハッシュ関数として,アルファベットの ASCII コードを 10 進表記法で表したときの 1 の位の数を用いることにする。衝突が起こるキーの組合せはどれか。ASCII コードでは,昇順に連続した 2 進数が,アルファベット順にコードとして割り当てられている。
正解: エ
衝突(コリジョン)とは,異なるキーに対してハッシュ関数が同じ値(同じ格納位置)を返してしまうことです。
今回は、「キーが小文字のアルファベット1 文字であるデータを,大きさが10 のハッシュ表に格納」ということですが、アルファベットは26文字ありますので、それを大きさ10のハッシュ表に収めようとすると、確実に足りませんね。
また、以下の条件が提示されているので、それを元に実際に衝突する組み合わせを得るのがこの問題です。
この条件から、「とある文字からアルファベット順で10文字後の文字とは必ず衝突する」ということが分かります。なので、以下のように、横10列のレイアウトでアルファベットの表を作れば、同じ列にあるものが衝突するパターンであることが分かります。*逆に【同じ行】にある者同士は、絶対に衝突しません。
上の表では、同じ選択肢のものを同じ背景にしていますが、これで同じ列に同じ色のものがあれば、それが衝突するデータということが分かります。
なお、ハッシュ値を求めて比較することでも対応できます。その場合、実際の小文字 a の ASCII コードは 10 進で 97 です。これを元に、選択肢にある各文字のコードと「1 の位」(ハッシュ値)は次のようになります。*但し正確なASCII コードの 10 進数値である必要はないので、仮の値でも全然OKです。
各選択肢のハッシュ値を比較します。
いずれにしても、アルファベットの文字順は正確に覚えていないと、正解は出来ませんので、その点は注意が必要です。