令和元年度 秋期 午前 問10
アルゴリズム
ハッシュ法に関する問題
10進法で5桁の数 a₁a₂a₃a₄a₅ を,ハッシュ法を用いて配列に格納したい。ハッシュ関数を mod(a₁+a₂+a₃+a₄+a₅,13) とし,求めたハッシュ値に対応する位置の配列要素に格納する場合,54321 は配列のどの位置に入るか。ここで,mod(x,13) は,x を13で割った余りとする。
原典には「位置」0,1,2,…,11,12 と空の配列を並べた図が添えられている(格納先が0〜12であることを示すだけの図)。
- ア1
- イ2
- ウ7
- エ11
答えと解説を見る
✓ これが正解イ2
解説
五つの数字を足して13で割り、その余りが置き場所です。
ハッシュ法は、値そのものから置き場所を計算で決めてしまうやり方です。ここでのハッシュ関数は二段構えで、まず五つの数字を足し、次にその合計を13で割った余りを取ると定められています。与えられた数を桁ごとに見ると、5と4と3と2と1です。順に足していくと合計は15になります。15を13で割ると、商が1で余りが2ですから、置き場所は2の位置です。余りは0から12までの十三通りしか出ないので、置き場所も十三個そろえれば足ります。割る数に13が選ばれているのは、桁の並びの偏りを散らしやすいからです。合計を先に出してから割る、という順序さえ守れば桁数が増えても同じ手が使えます。合計の15をそのまま答えにしない点だけが、この問いの引っかかりどころです。割る数に素数を選ぶのは、同じ場所へ集まるのを避けるためです。
ほかの選択肢はなぜ違うのか
- ア1:1は、合計を13で割ったときの商にあたる値です。求められているのは商ではなく余りなので、割り算のどちらを使うかで分かれます。割り算から出てくる二つの数は、名前で区別しておけば取り違えません。商を答えにした形です。
- ウ7:7は、桁ごとの和を取らずに、54321をそのまま13で割った余りです。ハッシュ関数は、五つの数字を足してから割ると定めています。足す一手を飛ばすと、この値に落ちます。合計の15を13で割った余りは2でした。式に並んだ項の数を、指で追って確かめます。
- エ11:11は、与えられた数からは出てこない値です。合計は15で、そこから13を引いた残りは2でした。余りは、これ以上引けなくなるまで引いた残りだと考えると安全です。11もその範囲には入りますが、この合計からは導けません。合計と割る数を書き出して確かめます。
この問題の用語
- ハッシュ関数どんな長さのものからも決まった長さの値を作り出す計算。少しでも中身が変われば、できあがる値は大きく変わります。
- ハッシュ値データから計算した固定長の値のこと。同じデータなら必ず同じ値になるので、データの比較や検索を速くするのに使われます。
出典:令和元年度 秋期 基本情報技術者試験 午前 問10
同じ用語が出る問題
- 令和7年度 科目A 問9:暗号の危殆化に該当するもの(ハッシュ関数)
- 令和6年度 科目A 問9:ペネトレーションテストの問題(ハッシュ値)
- 令和6年度 科目A 問2:衝突が起こるキーの組合せ(ハッシュ関数)
- 令和元年度 秋期 午前 問36:動的解析に該当するもの(ハッシュ値)
- 平成27年度 秋期 午前 問36:デジタル署名に関する問題(ハッシュ関数)
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)