• ベストアンサー

ハッシュって?

Perlで、「ハッシュ」という概念が出てきますが、 どのような意味ですか? どんなプログラムを作成する時に便利なのでしょうか? なるべく早くお答えいただいた方からポイントを差し上げます。

  • u16
  • お礼率40% (100/250)
  • CGI
  • 回答数5
  • ありがとう数6

質問者が選んだベストアンサー

  • ベストアンサー
  • poposan
  • ベストアンサー率20% (3/15)
回答No.4

上記の人の方の通りハッシュは連想配列という意味です。 で、ハッシュと配列のどちらが良いか、という質問に対しては、どちらも良いし、どちらも悪い。ということです。 ハッシュには、順番の指定が出来ない。(一番最初に呼んだデータが、一番最初に出力されない) 配列は、キーとデータを取得しにくい。ということです。 しかし、ハッシュにデータを格納して、そのハッシュを配列の中に入れてしまえば、ハッシュに順番が与えられるのです。 下記の場所で検索か、質問をしてみると良いです。ためになりますよ。

参考URL:
http://www.parkcity.ne.jp/%7Echaichan/bin/qanda.cgi?modefg=9
u16
質問者

お礼

なるほど そういう観点で使えるんですね。 よく分かりました。

その他の回答 (4)

  • kokucho81
  • ベストアンサー率61% (157/255)
回答No.5

>私はデータベースは全て配列@で扱っているのです。 >「配列」よりも「ハッシュ」を使ったほうが便利なのは >どのような時なのでしょうか? そうですね~。はいれつでやっちまう、といってしまえば、それはそれでOKな気も・・・(というのは、PERL言語の配列は他の言語と違って、えらく柔軟性が高いと言うかなんと言うか、だいたい、型が違うものを配列にできるってどう言うこと? っていうか何の配列? とまぁ、C/C++系出身者などは思ってしまいますのですが・・・) たとえば、次みたいなときに、ちょろっと使ってみるとか。。。 %ENGINE = ( yahoo => { url => 'http://search.yahoo.co.jp/bin/search?', keyword => 'p', }, goo => { url => 'http://www.goo.ne.jp/default.asp?', keyword => 'MT', }, infoseek => { url => 'http://www.infoseek.co.jp/Titles?sv=JP&tds=0&', keyword => 'qt', }, google => { url => 'http://www.google.com/search?lr=lang_ja&', keyword => 'q', }, fresheye => { url => 'http://search.fresheye.com/?', keyword => 'kw', }, excite => { url => 'http://www.excite.co.jp/search.gw?c=japan&lk=excite_jp&', keyword => 's', }, lycos => { url => 'http://www.lycos.co.jp/cgi-bin/pursuit?cat=jp&', keyword => 'query', }, ); とかね。

u16
質問者

お礼

たびたびすいませんです。 Perlの配列って柔軟性が高いようなんで いつもそうしてました。 いろいろなアドバイスありがとうございました。

  • kokucho81
  • ベストアンサー率61% (157/255)
回答No.3

ハッシュとは「連想配列」もしくは「セット」といわれるものです。 「連想配列」のような概念が、「既存組みこみの変数」として実現されているのは珍しいかもしれません。Perl言語の特徴がかいまみえます。 C++やJavaなどの言語でも、「組みこみ変数」ではなく、「ライブラリ」として実現されています。 この連想配列とは一般的に「データベース構築」の基礎概念となるものです。 例えば、学校などでは、「学籍番号」なるものがあり、 「何番の生徒?」と問いただせば、「鈴木太郎」などというように、わかりますよね。その逆に「鈴木太郎?」と問いただせば、「何番の生徒」ということもわかります。 このように、それぞれの「学籍番号」とそれに対応した「生徒名」、この組み合わせ(連想)が、数多くある(配列)、ことから、連想配列というのです。

u16
質問者

お礼

ご丁寧な回答 ありがとうございます。 なかなか使いこなすのは時間がかかりそうです。 私はデータベースは全て配列@で扱っているのです。 「配列」よりも「ハッシュ」を使ったほうが便利なのは どのような時なのでしょうか? もしよろしければアドバイスください。

  • N-T
  • ベストアンサー率40% (15/37)
回答No.2

ハッシュとハッシュ関数というのは別物ではないのですか。 下はPerl&CGIに関する解説サイトです。

参考URL:
http://www.rfs.co.jp/sitebuilder/perl/03_03.html
u16
質問者

お礼

このホームページずっと昔、見たことがありました。 あらためて見てみるとよく分かりました。 どうもありがとうございます。

  • x-game
  • ベストアンサー率42% (80/189)
回答No.1

こんにちは. 参考URLにリンク張っておきました. また,CGIのカテゴリに書き込まれているので下のアドレスも参考になると思います(多少ハッシュについても載っています). http://www.parkcity.ne.jp/~chaichan/src/perl01.htm

参考URL:
http://www.math.s.chiba-u.ac.jp/~matsu/gpg/gpg-0.html#hash
u16
質問者

お礼

なるほど。 ハッシュ関数というのもあるんですね。 参考になりましたがちょっと私のほしい答えと違っちゃいました。 またお願いします。

関連するQ&A

  • ハッシュのハッシュでデータベース

    ハッシュのハッシュになっているデータをファイルに書き出しておき、必要なときにまたプログラムから使いたいと思っています。検索スピードを問題にするほどの量ではありませんし、チェックのために時々は自分で読みたいので、どちらかといえばテキストデータのほうが便利かなあと考えていますが、特に決めてはおりません。 何か便利な方法がありましたら、教えて頂けないでしょうか。

  • ハッシュ関数について質問です。

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

  • 二次元ハッシュの引き出し方について

    2次元のハッシュをObjectを用いて作り、以下の様に第一キー固定で第二キーを取り出したいです。 ----------------------------------------------------------- hash = new Object; hash[3] = new Object; hash[3][1] = 3; hash[3][2] = 6; hash[3][3] = 9; for (key in hash[3]){  _root.debug+=key; } ----------------------------------------------------------- 上記は上手く動かないので、以下の様に修正しました。 ----------------------------------------------------------- hash = new Object; hash[3] = new Object; hash[3][1] = 3; hash[3][2] = 6; hash[3][3] = 9; tmp=hash[3]; for (key in tmp){  _root.debug+=key; } ----------------------------------------------------------- いったんtmpに代入する事で期待通りの結果が得られましたが、スッキリしません。 Perl等の他言語では、「無名ハッシュ」という概念を表記化することができるので、Actionscriptでも良い表記方法がありましたら教えてください。 ※オーサリングルールはParaFla! ActionSctiptは1.0相応です。

  • あらゆる種類の情報をハッシュで一定量に揃えれるなら

    0バイトの情報(情報が無いという情報)でもデータセンター1棟丸ごとの情報でも、もし仮にハッシュ関数を通すことができれば、一定のビット数で要約ができるのなら(他の情報と区別がつけられるのなら)、情報の表す意味と、その情報の特定性は、切り離す方向で考えたほうがいいのでしょうか。 例1 プログラムの作成時、関数名を決めたいが文字数制限があってうまく決められない→ 自分で充分に満足するような関数名をまずメモ帳にでも書いてみて、プログラムソース上はそのハッシュ値で関数名を決めてしまう。(当然、読みづらいソースになるので、HTMLのブラウザのような専用ビューワやエディターで閲覧編集する) 例2 あるWebサービスである名前でIDを取りたいが既に他人に取られていて自分のものとして使えない→諦めてハッシュをIDとする(それでも取られていたら変更回数として0でも末尾につけてまたハッシュする) そのWebサービスで取りたかったID名との対応表みたいのもまたネットに置いておく(オンラインブックマークにコメント記入するなど)

  • %inや$inがわかりません・・

    Perlを勉強し始めて1週間です。 入門書を3冊ほど購入して、サンプル掲示板をもとに 勉強しています。 変数やハッシュなどは入門書である程度概念はつかめました。 しかし、サンプル掲示板のプログラムに何度も出てくる、 if ($in{'mode'} eq ・・・・ の $in の部分が分かりません。(この場合の$inはスカラーでなくハッシュなのは分かりました) スカラーにしてもハッシュにしてもその中身をプログラム中で定義してやらなくてはいけないのですよね? でも、サンプルプログラムのどこにも定義がしていないのです。これは何なのか教えて下さい!

    • ベストアンサー
    • Perl
  • セキュリティ証明書のハッシュ値について

    セキュリティ証明書(SSL通信時などに利用する証明書)には 拇印情報があり、ここは証明書自身のハッシュ値が記録されていると聞きました。 証明書から作成されたハッシュ値を再びハッシュ値に記載したら 元の証明書を書き換えているため、次回ハッシュ値を求めたら別のハッシュ値になりませんか? 1.証明書 -> [ハッシュ関数] -> ハッシュ値 2.ハッシュ値を証明書に記述記載 3.証明書(ハッシュ値付き)-> [ハッシュ関数] -> ハッシュ値 1と3の結果のハッシュ値同士は一致しないですよね? GMailの証明書を見ると、sha1で、 90adbe01984695b6649ad0f9ef4f1b5836eb380d という値になっていて、 私の端末(WindowsXP)でfcivコマンドを実行した結果も fciv -sha1 gmail.cer 90adbe01984695b6649ad0f9ef4f1b5836eb380d gmail.cer となり、同じ値なのですが。。。 証明書に記載されているハッシュ値はどのように計算されているのでしょうか?

  • 動的なハッシュの配列を作成したい

    #お世話になります。最終的には、下記のように配列の順番にハッシュを作成したいのですが、ご教授願えませんでしょうか #!/usr/bin/perl #想定される配列 @array=(0,2,4,6,8,1,3,5,7,9); #下記が最終的に動的に作成したいハッシュの形です。 %List = ( '0' => [ (@array0_n) ], '2' => [ (@array2_n) ], '4' => [ (@array4_n) ], '6' => [ (@array6_n) ], '8' => [ (@array8_n) ], '1' => [ (@array1_n) ], '3' => [ (@array3_n) ], '5' => [ (@array5_n) ], '7' => [ (@array7_n) ], '9' => [ (@array9_n) ], ); $a='array'; $n='_n'; foreach (@array){ #試行錯誤中... print "\@{${a}[$_]{$n}}=@{${a}[$_]{$n}}"; } __END__; お忙しいかとは存じますが、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • どなたか教えて下さい。

    どなたか教えて下さい。 仕事でデータのハッシュ値を求める必要がありまして、質問致します。 ハッシュ値はマイクロソフトが提供しているfciv.exeというソフトを使い、希望のファイルのハッシュ値が、正しいことを確認しました。(正しいのは当たり前でしょうが・・・) 多少perlの知識がありましたので、perlで他の方のHPを参考にしながら、ハッシュ値を計算したところ、fcivと異なってしまって、誤った値が出ます。 何がおかしいのでしょうか? 作成したperlプログラム↓ use strict; use Digest::SHA1 qw(sha1_hex); open (INFILE,">c:\a_test.txt"); my %file = <INFILE>; print sha1_hex(%file),"\n"; close(INFILE); ちなみに開くファイルに指定したa_test.txtにはSHIFT_JISで「A」を40個入れてみました。 FCIVでは、a_test.txtの回答が5cdbb...で上記perlプログラムだとda39a3...になります。 ちなみに、a_testと名前を変え、バイナリーデータも同じように作成しましたが、 FCIVでは、回答が、5efef....上記perlプログラムではda39a3...となり、perlプログラムの方ではバイナリとテキストが同じ値になってしまいます。 ハッシュ値をよく理解してないことに問題があるのは承知ですが、どなたかプログラムの修正、ご指導宜しくお願いします。

    • ベストアンサー
    • Perl
  • パスワードをハッシュにしてDBに収納って無意味では

     PHPとMySQLを勉強中のものです。  教科書本の中でサイトへのログインパスワードなどは、ハッシュにするなどしてデータベースに入れた方が安全だとありました。  ハッシュにするというのは今では当たり前のようですが、これって意味あるのかな?という疑問もあります。  おそらくデータベースがハッキングされるなどして覗かれた時にパスワードを漏らさないためだと思うんですが、そもそもデータベースがハッキングされてる時点で終わってますよね?  サイトへのログインなんてしなくても、直接データベースを触れる状態なんだから、ログインパスワードなんて必要ないと思うんですが…。  データベースそのもののパスワードをハッシュ化してどこかに収納するというなら分かるんですが、データの一部でしかないログインパスワードをハッシュ化して意味あるんでしょうか?

  • DB内にMD5でハッシュ化されたパスワードとの照合

    MySQLのDBにMD5でハッシュ化されたパスワードが格納されているのですが、これをPerlのスクリプトで照合したいと思っています。 具体的には、DBに格納されているパスワードを用いて、Perlで作成された会員専用ページなどにログインをするといった感じです。 DBIを用いてDBからの情報を取得することはできたのですが、Perl側での対処がわかりません。 Perl側で入力されたパスワードをハッシュ化して、双方を照合するなどの情報を見たのですが、いまいち解らず認証することができませんでした。 以下にパスワードに関する部分のソースを記載させていただきます。 srand(); @salt = ( "A".."Z", "a".."z", "0".."9", ".", "/" ); $salt = '$1$' . join('', map($salt[int(rand(64))], 1..8)) . '$'; $pass = crypt($in{'pass'}, $salt); crypt($in{'pass'},$ary) eq "$ary") ※$aryはDB内に格納されているパスワードです Perlに関して殆ど解っていないもので、とんちんかんな記述かもしれませんが、ご教授いただけますと幸いです。 宜しくお願いいたします。