画像からユニークなIDを生成するアルゴリズム

このQ&Aのポイント
  • 画像データからユニークなIDを生成する方法について
  • 同一データからは必ず同一IDになる仕組みと別の画像から同一IDが生成される可能性を排除する方法について
  • 色や画像サイズ値、複数のアルゴリズムを組み合わせることも考慮可能な方法
回答を見る
  • ベストアンサー

画像からユニークなIDを生成するアルゴリズム

画像データからユニークなIDを生成したいです。 データ元は、ファイル名やメタデータを含まない、画像データ本体のみという事にします。 可逆性は問わないので、元の画像を推測出来ても出来なくても、どちらでも構いません。 こだわりたいのは、同一データからは必ず同一IDになるということと、 別の画像から同一IDが生成される可能性を極力排除したいということです。 IDの形式や桁数はこだわりません。 色から生成したIDと画像サイズ値をセットにしたり、複数のアルゴリズムを組み合わせても構いません。 画像サイズによってIDの桁数が変化しても構いません。 桁数は少ない方がいいですが、それよりは別画像から同一IDになる事態を避ける事の方が優先です。 宜しくお願いします。

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

  • ベストアンサー
  • pringlez
  • ベストアンサー率36% (598/1630)
回答No.3

あなたの言う「別の画像から同一IDが生成される可能性を極力排除したい」という言葉の意味があいまいでよくわかりません。「たまには衝突があってもいい」と言う意味なのか「絶対に衝突を許さない」という意味なのでしょうか、どちらですか。 普通に日本語を解釈すれば「完全に排除する必要はまったく無い」「たまに衝突しても何も問題ない」という意味のはずですが、No.1, No.2のお礼を見ると、普通の日本語として解釈した意味とあなたの要望はずれているようにも感じます。 日本語がずれておらず「たまには衝突があってもいい」ということならばハッシュ値を使う方法で十分でしょう。またハッシュを使えばまれに衝突するのはやむをえないでしょう。 「絶対に衝突を許さない」という意味ならばBase64でエンコードでもすればいいでしょう。長くはなりますが完全にユニークなIDとすることが可能ですよ。逆にそうでもしない限りは衝突を避けることは不可能です。

BindNet
質問者

お礼

他のサイトで、 画像の全体の色味情報として、数ピクセル程度まで縮小した画像、 画像に含まれる形状の情報として、輪郭追跡より求めた曲線データ、 これらを数値化したものにハッシュ値を加えた、三要素をIDとする案が出てきましたので、 これにて質問を締め切りたいと思います。 皆様本当に有り難うございました。

BindNet
質問者

補足

ご回答有り難うございます! 大変本質的なご指摘です。 それでは、衝突の許容度は、画像の内容によって変化する事にします。 人の目で見てどれも同じような場合、例えば、全面ノイズ画像などの場合には、衝突して構いません。 逆に、お気に入りの場所で撮った思い出の一枚が、全くの別画像に化けることは絶対に避けたいということにします。 比較する対象は、1ビット単位のデータ値ではなく、あくまでも人間が見る為の画像です。 どうぞ宜しくお願いします!

その他の回答 (3)

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

>カリフォルニアでジョンさんが撮った写真と、ムンバイでアショークさんが撮った写真が同一IDになってしまう気がするのです。 ハッシュ値やCRC値は、確かに「異なるデータで同じ値が生成される場合がある」ので、単一のアルゴリズムでは、同一の値が出る可能性があります。 しかし、異なるアルゴリズムを複数用いた場合、例えば データの先頭から正順に求めたCRC32値 データの先頭から正順に求めたハッシュ値 データの末尾から逆順に求めたCRC32値 データの末尾から逆順に求めたハッシュ値 の4つを用いた場合「同時に、4つとも、すべて同じ値になる可能性」は、ほぼゼロです。 それぞれが32ビット値だった場合、4つとも全部一致してしまう確率は「1/(2の128乗)」です。 32ビットが4つ、合計で128ビットなので「1/(2の128)乗」が「重複する確率」になります。 これは「1/340282366920938463463374607431768211456」になります。 つまり「画像が340282366920938463463374607431768211456枚以上あったら、1枚くらい重複するかも知れない」と言う確率です。 このくらいの確率なら「ほぼゼロ」と考えて差し支えありません。 心配なら、8つの方法を組み合わせて「32ビット×8」にして、IDを256ビットにしてしまいましょう。 256ビットのIDが全部一致してしまう確率は「1/(2の256乗)」なので、確率は「1/115792089237316195423570985008687907853269984665640564039457584007913129639936」になります。 こう考えると「256ビットのハッシュ値1つで事足りる」ので、CRCは要らない事が判ります。 「256ビットのハッシュ値が重複してしまう確率」は「1/115792089237316195423570985008687907853269984665640564039457584007913129639936」ですからね。

BindNet
質問者

お礼

有り難うございます! 自分はデザイン系出身でiOSアプリしか作った事がなく、 プロクラミン系の知識は皆無なので、 ものすごく確率が低いという事をわかりやすくご説明頂けて、とても安心しました。 ただ、'画像'というものの特性を生かしたアルゴリズムがもしあればとも思うので、 もう少し締め切らずに様子を見てみたいと思います。

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

複数のアルゴリズムのCRC値と、複数のアルゴリズムのハッシュ値を求めて、それらを結合した値をIDとすれば良い。 例えば、画像を「単なるバイナリデータの羅列」と考えて、そのバイナリデータの羅列に対して データの先頭から正順に求めたCRC32値 データの先頭から正順に求めたハッシュ値 データの末尾から逆順に求めたCRC32値 データの末尾から逆順に求めたハッシュ値 の4つを求めて、それらを「文字化」して、その「文字化した4つの文字列」を単純に連結した文字列をIDにする、など。 「CRC32関数」や「ハッシュ関数」は、googleなどで調べればすぐに見付かる筈です。

BindNet
質問者

お礼

早速のご回答ありがとうございます! ハッシュ値やチェックサムなど、目から鱗が落ちました。 これで殆ど行けそうな感じなので、調べて検討してみたいと思います。 ただ、もうひとひねり、IDの衝突を避けるための仕掛けをプラスできると安心なのですが‥ カリフォルニアでジョンさんが撮った写真と、ムンバイでアショークさんが撮った写真が同一IDになってしまう気がするのです。

  • t_ohta
  • ベストアンサー率38% (5085/13292)
回答No.1

MD5とかSHAとか使ってハッシュ値を求める方法はどうでしょう。

BindNet
質問者

お礼

早速のご回答ありがとうございます! ハッシュ値とは知りませんでしたので、とても助かりました。 調べて検討してみたいと思います。 ただ、IDの衝突を避けるための仕掛けがもう一つあると安心できるのですが‥

関連するQ&A

  • 最強の圧縮アルゴリズムは?

    ZIPとかCabとかの圧縮はもう限界が見えてきた ような気もするんですが、MPEGなどの不可逆圧縮 アルゴリズムは研究者の頭脳次第でまだまだ いけそうな気がするんです。 そこでお聞きしたいんですが、MPEGなどの映像を扱える 圧縮方式でMPEGをも超える(同一ビットレートで サイズや画像の綺麗さがすごい)最強のものって ありますか?

  • 圧縮された画像データの復元って?

    Photoshopで、 (1):Tiff画像データをJpeg画像データに変換すると、非可逆圧縮され、データ量が小さくなりますが(当たり前ですね、、、) さらに、(2):一度圧縮保存した同じ画像を再度読み出して、Tiffに再変換しすると、(1)と同じデータ量を示します。 これって、どういうことになっているのでしょうか? 非可逆とは、字のごとく、元に戻らない(もしくは一部は元に戻らない)、という意味ではないのでしょうか? 想像するに、(2)のデータは非可逆圧縮(一部のデータを廃棄)されているので、(1)と全く同じではない、と考えるのですが、Jpeg圧縮前と同データ容量としてTiff化されるので、不思議です? この内実は、非可逆圧縮時に廃棄されたデータが再変換される時に、実態のない架空水増しデータが作成されて、データ容量としてのみ、それを補っているということなのでしょう? また、Jpeg変換時の圧縮率(=廃棄率?)にもよるのでしょうが、Tiff⇒Jpeg⇒Tiffに再変換した時、どの程度のデータなら廃棄されずに復元されるのでしょうか? この場合のJpegデータは、レタッチ処理やJpeg上書き保存を一度もしていないものとして。 いかがでしょうか?ご教示ください。

  • 文字列の検索アルゴリズム

    「私は世界一頭がいいので、数学なんか簡単すぎていいかげん飽きてきた。」 この文字列から「いいかげん」を検索するアルゴリズムにはどんなものがあるのでしょうか? 条件 ・100KB(5万字)程度のデータから10文字程度指定文字列を検索する。 ・100KBと元データもそれほど大きくないので、プログラムが簡単なアルゴリズムが良い。 ・そのアルゴリズムの解説がインターネット上にあること。 単純に「い」を探して合致したら次の文字も「い」であることを確認。 さらに次の文字が「か」であることを確認。 さらに・・・「げ」・・「ん」 とやっていく方法でも良いとは思うのですが、もしかしたらもっとお手軽かつ高速にできる方法があるのかなと思い質問してみました。 なければないという回答でもかまいません。 また、参考までにテキストエディタ等がどのようなアルゴリズムを用いているのか知っている方(推測できる方)はその方法についても教えて頂ければと思います。 よろしくお願いします。

  • 画像ファイルの圧縮

    あるテキストで、 ....上記で、BMP以外の形式はデータ容量を小さくするために圧縮ができる形式であり、そのうち、Tiff GIF PNG は一度圧縮しても元に戻すことができる可逆圧縮方式ですが、JPEGは一度圧縮すると元に度せない、非可逆圧縮方式です。 ---------------------- という説明がありました。 ここでの圧縮というのは、zipなどのことを言っているのではないと思うのですが、そうすると、 画像処理ソフトで、そのファイルを開き、保存(変換)する際に、何段階か、品質と、容量のサイズの小ささのトレードオフで、選べたりすると思います。 可逆というのは、その際に、サイズを例えば小さくして保存して、またあとで開きなおして高品質な容量の大きなファイルにすることもできる、といったことを意味しているのでしょうか。それはそれで信じにくいのですが。

  • 一意(ユニーク)かつ、ソートに対してランダムな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程度を考えていますが、もっと大きなオーダーでも衝突しないに越したことはありません。

  • 掲示板のIDについて

    ネット上の掲示板で投稿者のニックネームの横にIDが表示される場合があります。このIDはIP(SA)アドレスを元に文字列が生成されると思っていて同一IDならニックネームが変わろうと発信者は同一(同一のマシンから)と思っていました。時々PCなどはプロバイダーからIPが変わる可能性があるかもしれないが、IPの払い出しは普通は同じものだろう とある掲示板で『同一ID=同じ人物ではない』とあり、真偽のほどをご教授ください。掲示板はPCもしくは携帯からでも書込み可能だとおもいます。 踏み台のサイトとか携帯からでは事情がちがうのかな? よーわからん。。すみません。初歩的なことで。よろしくお願いいたします。

  • cgiで動的にファイルを生成しているその仕組みは?

    cgiで生成されるファイルといえば.datのようなテキスト形式のデータが一般的ですが、探してみるとcgiで動的に画像やmidiデータをWeb上で生成しているものがありました。これはどのような仕組みでファイルを生成しているのでしょうか? 調べてみたところ、やはりcgi単体では動作せず、生成するデータの情報が書かれたモジュールと呼ばれるものが別で必要になるらしいです。ではこのモジュールはどのようにして作るのでしょうか? 皆様の知恵をお貸しください。 僕が見つけたmidiを生成するcgiはこちらです↓ http://www.donzoko.net/cgi/wmidi/index.html

    • ベストアンサー
    • CGI
  • PHPによる画像の生成による色の変化

    お世話になっております。 PHPでアップロードしたjpg画像を縮小して生成しているのですが、色がおかしくなってしまいます。 (全ての画像が荘ではないのですが、変わるものは元の画像とはまったく違った青の強い色になってしまう。) ソースはこんな感じなのですが、何かおかしい部分があったらお教えいただけますでしょうか。 また、何か画像処理を加えてあるものを使用するとこのような経験がある方いらっしゃいましたらよろしくお願いいたします。 version 4.3.8です。 ******************** function imgjpg($_val1,$_val2,$_val3) { $size=GetImageSize("$_val1"); $image_in = ImageCreateFromJpeg("$_val1"); //縦長か横長か計算 $ratio = $size[0] / $size[1]; if($ratio > 1){ //横長の場合 $image_out = ImageCreate($_val3,$_val3 / $ratio); imagecopyresized($image_out,$image_in,0,0,0,0,$_val3,$_val3 / $ratio,$size[0],$size[1]); } else {//縦長の場合 $image_out = ImageCreate($_val3 * $ratio,$_val3); imagecopyresized($image_out,$image_in,0,0,0,0,$_val3 * $ratio,$_val3,$size[0],$size[1]); } ImageJPEG($image_out,$_val2); ImageDestroy($image_in); ImageDestroy($image_out); ********************

    • ベストアンサー
    • PHP
  • IPアドレスとIDについて

    この項目でよいのか判らないのですが、もしカテ違いならスミマセン。 初心者的な質問で申し訳ありませんが、是非教えて頂きたい事をかかせてもらいます。 とある趣味の掲示板(2ちゃんではありません)を利用しており、そのサイトでは、投稿者のIPアドレス等を元に自動的にIDを生成して表示されるシステムです。 僕はあまり気にしてなかったのですが、パソコンを持ち歩き、戻ってきて再アクセスして、書きこみをしたところ。 『ドメインが同じだ。もしかして、さっきの人ですか?』と言われました。強制IDは変わっていたのに何故わかったのかな?と思いました。 IPアドレスからドメインが検索できるって所までは判ったのですが、自動的に生成される強制IDからIPアドレスが何故判るのか不思議でなりません。 IDからIPアドレスが判るなら、自動的にIDを生成する必要ってないんじゃないでしょうか?

  • autoincrementで生成された値を別のフィールドの値中にも入れ

    autoincrementで生成された値を別のフィールドの値中にも入れたいのですが可能なのでしょうか? つまり何か新規商品のデータを入れる際に、商品IDをautoincrementで生成するとともに、その商品名のフィールドに「商品ナンバー:"autoincrement値"」と入るようにしたいのです。 直近のINSERTの際にautoincrement生成した値を次の(別の)SQL文で利用するというのはmysql_insertidなどで可能なのは存じているのですが・・・。

    • ベストアンサー
    • MySQL