• 締切済み

ハッシュの考え方、使用例を分かり易く教えてください。

imogasiの回答

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

ハッシュ関数と言うのが考えられていて http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E9%96%A2%E6%95%B0 にあるように 暗号化 誤り検出 改ざん検出 ハシュテーブル などに使われます。 ハシュという時、どの関連を言っているかか注意しましょう。 データベース構成と検索に関連して述べてみます。 例えば口座番号が7桁あるとします。ディスクに1千万区画の記録区画を用意すれば、どんな口座番号が来ても、その数字番目の区画に記録できます。 しかし口座番号に空きがあって、実際は100万口座しか使われてないとき、ディスクに100万区画を用意しておき、ある口座番号が来た時に、もし100万の中に散らばって、記録場所が決められれば、能率的です。 F(口座番号数字)=数字 Fは何か計算すること(関数)を意味します。 特徴は口座番号数>>数字(>>は相当少ない意味)でないと意味を持ちません。 そして口座番号数字が色々変ってはいってきた場合、数字は別のものになることが望ましい。なぜなら重複する数字になると、後からの口座の記録場所がなくなるから。 さてそんな関数Fがあるかどうか。 http://ja.wikipedia.org/wiki/%E4%B8%80%E6%96%B9%E5%90%91%E6%80%A7%E9%96%A2%E6%95%B0 にある一方向性関数と言うのが研究されています。 これの良いところは、計算で「数字」が出て、そこに記録されていることが決まっているから、そこだけを見に行けば良く、速く探しやすい。 目次インデックスを使うようなのは、何段もディスクをアクセスして辿らないと行けないのに比べて速い。 ディスクのファイルを読む時間>>場所を計算する時間。 http://www.db.is.kyushu-u.ac.jp/adp/ad/hash.pdf の配列による探索とハッシュ法に当たります。 しかし衝突は避けられず、衝突するケースを5%とかに押さえて設計し、衝突すれば別の区画にお引取り願うように 設計する。 例えば123、345、231、345があるとしてそれぞれに何かの演算をして1,2,3,4の数字を出せれば 一番良いのですが。 長くなるので、一端を記してみました。 Hashは「肉を切り刻む」「メチャメチャにする」「(フランス古語の)斧」から来ておるそうです。 MOD関数などを使って、出した結果の数が元の数・原型を窺えないところからでしょうか。

関連するQ&A

  • ハッシュのハッシュのソート

    rubyでハッシュのソート方法についてはいくつか情報のサイトを見つけられました。 ですが今やりたいのは、ハッシュのハッシュのソートなのですが、うまいやり方がわかりませんでした。 具体的には、 h1 = {"user1"=>{"a"=>10, "b"=>20, "c"=>30"}, "user2"=>{"d"=>5, "e"=>8}, "user3"=>{"f"=>10, "g"=>5, "h"=>10} } というようなハッシュのハッシュを想定しています。ユーザごとに案件ごとの必要工数(時間)をハッシュとして持たせ、全工数が多いユーザ順にソートしたいのです。 上記の場合だと、 {"user1"=>{"a"=>10, "b"=>20, "c"=>30"}, "user3"=>{"f"=>10, "g"=>5, "h"=>10}, "user2"=>{"d"=>5, "e"=>8} } というようにソートしたいのですが、何かやり方がありましたらご教授いただけますでしょうか。

    • ベストアンサー
    • Ruby
  • 投票データをハッシュを使用して入出力する

    こんにちは。tyabudaiと申します。 アンケート(投票)のCGIを 作成しようと思っています。 ログの中身は、(とりあえずカンマ区切りで) 「項目,数値」です。 処理のイメージとしては、 まずログファイルの内容を、 「項目」をキーとしたハッシュに取り込みます。 投票があった場合、 「項目」をキーとして「数値」を取り出し、 1つ増加させる処理をしたいです。 現在、他サイト様よりCGIをダウンロードして そのような処理がないか探していますが、 全く手がかりがありません。 まずは、ログファイルの内容をハッシュに取り込む方法を お教えいただけないでしょうか。 ご存知の方のお力添えいただければ幸いです。

    • ベストアンサー
    • Perl
  • ハッシュ関数

    ハッシュ関数について悩んでいます. ハッシュ関数の例として以下Wikiの引用です http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E9%96%A2%E6%95%B0 unsigned int hash(char *s) { unsigned int h = 0; for (;*s != '\0'; s++) { h = h * 137 + *s; } return h % 1987; } このハッシュ関数において, 「hの更新計算で用いる137という数は、2(7乗)+2(3乗)+2(0乗) というものであり、乗法した後にも2進数表現の下位の桁にも 情報が残るようになっている。そのため前の方の文字の情報が 桁あふれによって失われることはない。」 と記述されているのですが,私が考えてしまうのは以下の通りです. 「最終的にハッシュ値は合計を1987で割った余りになるのだから, 下位の桁(1~1987)に情報を残さなければならない. それぞれのsの上位から下位までの情報を合計の数値の下位に 残すのであれば,137は掛けるのではなく割るべき.」 もちろん私の考え方が間違っているのはわかりますが, なぜ137を掛けるのかを理解できません. どなたかわかりやすくご教授いただけたら幸いです.

  • ハッシュ探索とはどういうイメージなのか?

    ハッシュ探索というのは「対象となるデータから一定の手順で算出したハッシュ値を用いてデータ本体の代わりに比較に用いる方式」ということですが、どういうものなのかイメージが思いつきません。 これはつまり、データ本体を「ハッシュ」という文字列に変換して、ハッシュ値として出力したものを、比較する(全ての文字列において比較する)というイメージでよいのでしょうか? もしそうだとしたら、ハッシュ値の長さ(文字列の長さ)に応じて(比較)処理時間が変わってくるのでしょうか? 例えば、(あくまで例です。) 6文字程度のハッシュ値→0.2秒で(比較処理時間が)終わる 3万文字程度のハッシュ値→3秒ぐらい(比較処理時間が)かかる ↑こういう風にハッシュ探索は文字列の長さに応じて処理時間が変化するのでしょうか? 回答のほうお願いします。

  • Perlでいうハッシュとはどのようなものでしょうか?

    パールを勉強しています。 ハッシュとはどのようなものでしょうか。

    • ベストアンサー
    • Perl
  • ハッシュ(メッセージダイジェスト)について

    よろしくお願いいたします。 現在セキュリティの勉強をしております。 で、ハッシュについて確認したく投稿いたしました。 自分なりに勉強をして、 送信者がデータをハッシュ関数を使用してメッセージダイジェストを 作成し、受けても同じ事を行うのはわかりました。 つまり、 [データ]+[メッセージダイジェスト(データに添付する)]+[デジタル署名(データに添付する)] の3点をまとめて暗号化し、 受け取った相手が秘密鍵で [データ]+[メッセージダイジェスト]+[デジタル署名]に複合し 自分でもハッシュ関数を使用してメッセージダイジェストを作成し 送り手のダイジェストと比較すると理解しましたが 正しいのでしょうか? また、同じハッシュ関数で自分でも作成するみたいですが どこにハッシュ関数の情報が載っているのですか? いまいち自信が持てませんのでアドバイスお願いいたします。

  • ハッシュとツリー構造

    今学校でハッシュとツリー構造について勉強しています。 しかし、先生の言っていることがまったく意味が分かりません。 すいませんが、ハッシュとツリー構造について簡単でいいので教えてください。 お願いします。

  • ハッシュテーブルの使い方

    こんにちわ。 いまVB.Net2003でプログラミングをしている者です。 ORACLEのあるテーブルの内容をハッシュテーブルに取り込んで, キー検索する処理をしたいのですが, 取り込む際,ハッシュテーブルの「Add」メソッドで 1件ずつ取り込むしかないのでしょうか? たとえばコンボボックスの「DataSource」プロパティに レコードセットを設定するように,一回で設定したいのですが, このような機能があるでしょうか? またハッシュテーブルはキーは1つしか設定できないようですが, このテーブルデータを2つのキーで検索するのはどうすれば 良いでしょうか?

  • phpのパスワードのハッシュ化について

    phpで会員サイトの作成を学習しています。 PDOを使用してMysqlサーバーに接続しています。 開発環境はxamppでphp Version 5.5.15を使用しています。 入力フォームにユーザーの情報を入力してもらい、 データベースに格納する際、 基本的なセキュリティ要件として パスワードをハッシュ化する必要があるということを こちらのサイトで(http://php.net/manual/ja/faq.passwords.php) 知りました。 ハッシュ化については初耳で、いまいちハッシュアルゴリズムの種類による違い等はまだ理解しきれていないのですが、 PHP5.5.15を使用しているので、パスワードのハッシュアルゴリズムは 上記サイトに載っているようにpassword_hashを使用するのが今のところ最善なのでしょうか? また、ハッシュ化されたパスワードの認証についてですが、 ログイン画面でパスワードを認証する際、 ユーザーが入力したパスワードをハッシュ化して 該当レコードのハッシュ化されて保存されたパスワードと 同じであれば認証が成功するという認識で正しいでしょうか? ご回答、よろしくお願いします。

    • ベストアンサー
    • PHP
  • ハッシュ関数について質問です。

    プログラミング・数学? 初心者です。 IDやパスワード管理によく出てくる一次方向(ハッシュ)関数ですが、 よくパスワードとSALTを一緒にしてハッシュ関数を通してハッシュ値を取得しますよね。 そしてその結果(データベースなどに記録済み)とログイン時に入力した値とを照らし合わせるわけですが、 昔まだ若いころ、これとは別のタイプのハッシュ関数を使用したことがあります。 それはある(パスワードなどの)値をハッシュ関数で処理すると「いろんなハッシュ値」が生成され、 そのハッシュ値から当然パスワードは予測できないのですが、 しかしその複数のハッシュ値は全て、そのパスワードから生成されたハッシュ値だということは分かる、という関数を使用したことがあります。 その時はperlのcpanモジュール(名前を覚えていません。すいません。)を使ったのですが、この別のタイプのハッシュ関数はどういう仕組みで作られているのでしょうか? SALTが複数あり、そのそれぞれについて照合している?だけでしょうか? それとも私が無知で、そんな関数がそもそも存在するだけでしょうか? わかりません。教えてください。