• ベストアンサー

ハッシュ化で元の文字列の方が長くても大丈夫ですか?

例えば1000桁の文字列をphpのhash()でsha512を用いてハッシュ化した場合、重複の危険性は 無視出来る程度なのでしょうか。 ご存知のかた、お手数をおかけいたしますがご回答のほどよろしくお願い致します。

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

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8525/19382)
回答No.3

「ハッシュ関数の特性」により、文字列が何文字だろうが、ハッシュ値が何ビットだろうが「重複の可能性は0じゃない」です。 「無視できる程度」と判断して無視した場合でも「重複が起きる時は一発で起きる」と言う事を判った上で判断して下さい。 上記を踏まえた上で。 sha512のハッシュ値は512ビットです。 1000桁の半角文字列が取り得る組み合わせ数は、可読文字96文字のみに限定すると、96の1000乗、1.86e+1982個です。 1.86e+1982個の文字列を、1.34e+154個のキーで表す事になります。 つまり、キー1つに付き、1.39e+1828個の文字列が重複します。 キーの個数と、文字列が取り得る組み合わせ数から言えば「ほぼ常に重複が起きる」と言えます。 ハッシュってのは「元の文字列が長ければ長いほど、ハッシュ値のビット数が小さければ小さいほど、重複が増える」ので、元の文字列が1000文字もあったら「常に重複する」と考えましょう。 因みに、半角77文字以内なら、文字列の個数よりキーの個数の方が多いので「重複を無視しても良い」と思います。 言い換えれば「重複が無視出来るのは、元の文字列が半角で77文字以内」と言えます。

ygn001
質問者

お礼

詳細な解説ありがとうございます。 ハッシュ化で文字数を減らしたかったのですが難しいことが分かりました。 みなさんご回答頂きましてどうもありがとうございました。

その他の回答 (2)

  • kngj1740
  • ベストアンサー率18% (197/1052)
回答No.2

扱うデータが全くランダムという事はまれで、どうしてもあるタイプのデータばかりというケースは珍しくありません。実際に実験してみないとなんとも言えません。たとえば人名なら全ての漢字がランダムに使われる訳ではありません。

  • wormhole
  • ベストアンサー率28% (1622/5659)
回答No.1

sha512だと、ハッシュ値は2の512乗通りあるわけですが、それがわかれば重複する確率は計算できますよね。それを無視できるとするかどうかはご自分でご判断ください。

関連するQ&A

  • PHPとObjective-Cでハッシュが違う結果

    Objective-Cでハッシュ値を生成し、PHPに送って、 PHP側でもハッシュ値を生成し、この2つを比較したいと思っています。 PHPでは、以下の関数でSHA256が取得できることがわかりました。 hash_hmac('sha256', $text, false) Objective-Cは自分で実装する必要があるようなので、以下のページのコードを使わせてもらいました。 http://zak-za-k.blogspot.jp/2011/09/objective-csha256.html この2つの関数それぞれで、同じ文字列を使ってSHA256のハッシュ値を出したのですが、 結果が違ってしまいます。 2つの関数で同じ結果を得られるようにするにはどうすればよいでしょうか。 参考にした上記URLのコードの内容は、ほとんど理解できていません。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • パスワードのハッシュ化について

    ユーザー登録させるようなwebサイトを作ることになりました。 ググッたところパスワードはハッシュ化させDBへ、っていうのが通常らしいんで、 sha256を使って変換しようと思います。 質問(1)ハッシュ化させる元の文字列には文字数など何か制限はないんでしょうか。 質問(2)ハッシュ化させるときにくっつけるsaltは何桁くらいにするのが一般的なんでしょうか。 教えてください。

  • 短いハッシュの作り方

    特に言語には関係がないのでこのカテゴリに。 md5やsha1でハッシュを作ると、32桁か40桁で大文字小文字の区別がないものとなります。 以下のような短いハッシュはどのように作るのでしょうか。 http://am6.jp/asRleJ http://twitpic.com/12zs0a http://bit.ly/axe7hu

  • 2次元ハッシュ または 2次元配列をソートしたい

    2次元ハッシュのソートをしたいです。 ハッシュは2つのキーを使用していて、 1つ目のキーは文字列、2つ目のキーは数字(0からの連番)です。 ハッシュの中身は文字列が入っています。 これを次のような表に見立てて、特定の列でソートしたいのです。 hash['a']['0'], hash['a']['1'], ..., hash['a']['50'], hash['q']['0'], hash['q']['1'], ..., hash['q']['50'], hash['c']['0'], hash['c']['1'], ..., hash['c']['50'], ... hash['d']['0'], hash['d']['1'], ..., hash['d']['50'], 例えば 6列目の値によってソートするということです。 以下のようにソートしようとしましたが、うまくいきません。 my @sorthash = sort { $a->[6] <=> $b->[6] } @hash; 何かヒントがあれば教えてください。

    • ベストアンサー
    • Perl
  • 文字列を数字に変換する暗号化方式

    与えられた文字列を、可変長 ( 6 ~ 10 桁程度 ) のアラビア数字に変換するような暗号化方式やハッシュ関数を探しています。 あるいは、出力結果が数字で、名前が付いている方式ならば、それに近いものでも構いません。 どなたかご存知の方はいらっしゃらないでしょうか。 ご回答よろしくお願い致します。

  • SHA1ハッシュの生成結果が異なる理由とは

    Windows で Digest::SHA1 というモジュールを使って 文字列のSHA1ハッシュを生成するプログラムを作ったのですが、 $x = <STDIN>; と書き、100 と入力して生成したハッシュと、 あらかじめ $x = 100; のように設定しておいて生成したハッシュとでは、内容が異なっています。 前者は 310b86......、後者は 6a2903...... と出ます。 これはなぜでしょうか? 一致させるにはどうすれば良いのでしょうか。 ご教示ください。よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • ハッシュ探索とはどういうイメージなのか?

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

  • 文字列から乱数を作る方法について。

    最近PHPの勉強をしており、文字列をhash関数の入力として用いて、0~100の乱数を生成する機能を実装しました。 ですが、出力結果に偏りがみられます。 再現性を残して、できるだけ偏りの無い乱数を作りたいと考えています。 何かいいアイデアやサイトを御存知でしたら教えてください。 現在は以下のようなコードで乱数を生成しています。 $seed = hash("sha512",$setstring); $seed = $seed[0].$seed[1].$seed[2]; $seed = intval($seed,10); srand($seed); for($i=0; $i<10; $i++){ $lv = rand()%100; }

  • 一意(ユニーク)かつ、ソートに対してランダムなIDの発行方法

    随時増加するあるデータに対して、一意なIDを割り当ててゆきます。 通常は、1, 2, 3, … と連番を割り当てて行けば一意なIDになると思います。 その上で、IDでソートした時に発行順に並ぶのではなく、順番がランダムになるようにしたいのです。 (アルゴリズムを知らない人から、発行順を推測されないようにしたい。) そこで考えたのが、"1", "2", "3", …という文字列に対するハッシュ(SHA1やMD5)ですが、sha1("1"), sha1("2"), sha1("3"), …とIDを発行していった場合、IDが重複してしまう可能性を心配しています。(とても低い確率ではあることは分かっていますが、皆無ではありません。) ハッシュ関数を利用する他に、「一意」で「ランダム」で「衝突の可能性がゼロ」である文字列の生成方法はありませんでしょうか?(可能性がゼロというのは物理的に不可能だと思うので、例えばSHA-1であれば、160bitのハッシュが生成されますが、2^160個のIDを発行しても重複しない、ということを考えます。) 一応、規模は1000万ID程度を考えていますが、もっと大きなオーダーでも衝突しないに越したことはありません。

  • PHPとJavaでSHA256の結果を同じにしたい

    PHPから JavaServletにアクセスするシステムを作っています。 その際にパラメーターの改ざん対策にハッシュを渡すようにしたいのですが PHPでSHA-256でハッシュ化した値と JavaでSHA-256でハッシュかした値が異なってしまいます。 PHPだとハッシュ化する際の秘密鍵を指定する項目がありますが Javaでは見つかりませんでしたので この項目が違うために結果が違うのだと予想していますが Javaが内部的に使っている秘密鍵はどこか取得できるのでしょうか? やりたいこととしてはPHPとJavaで同じハッシュが取得できるようにしたいのですが 良い案とかやり方あったら教えてください。 ◆php string hash_hmac ( string $algo , string $data , string $key [, bool $raw_output = false ] ) ◆Java DigestUtils.sha256Hex(string data) わかる方いましたら教えてください。よろしくお願いいたします。

    • ベストアンサー
    • Java