- ベストアンサー
画像からユニークなIDを生成するアルゴリズム
- 画像データからユニークなIDを生成する方法について
- 同一データからは必ず同一IDになる仕組みと別の画像から同一IDが生成される可能性を排除する方法について
- 色や画像サイズ値、複数のアルゴリズムを組み合わせることも考慮可能な方法
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
あなたの言う「別の画像から同一IDが生成される可能性を極力排除したい」という言葉の意味があいまいでよくわかりません。「たまには衝突があってもいい」と言う意味なのか「絶対に衝突を許さない」という意味なのでしょうか、どちらですか。 普通に日本語を解釈すれば「完全に排除する必要はまったく無い」「たまに衝突しても何も問題ない」という意味のはずですが、No.1, No.2のお礼を見ると、普通の日本語として解釈した意味とあなたの要望はずれているようにも感じます。 日本語がずれておらず「たまには衝突があってもいい」ということならばハッシュ値を使う方法で十分でしょう。またハッシュを使えばまれに衝突するのはやむをえないでしょう。 「絶対に衝突を許さない」という意味ならばBase64でエンコードでもすればいいでしょう。長くはなりますが完全にユニークなIDとすることが可能ですよ。逆にそうでもしない限りは衝突を避けることは不可能です。
その他の回答 (3)
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
>カリフォルニアでジョンさんが撮った写真と、ムンバイでアショークさんが撮った写真が同一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」ですからね。
お礼
有り難うございます! 自分はデザイン系出身でiOSアプリしか作った事がなく、 プロクラミン系の知識は皆無なので、 ものすごく確率が低いという事をわかりやすくご説明頂けて、とても安心しました。 ただ、'画像'というものの特性を生かしたアルゴリズムがもしあればとも思うので、 もう少し締め切らずに様子を見てみたいと思います。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
複数のアルゴリズムのCRC値と、複数のアルゴリズムのハッシュ値を求めて、それらを結合した値をIDとすれば良い。 例えば、画像を「単なるバイナリデータの羅列」と考えて、そのバイナリデータの羅列に対して データの先頭から正順に求めたCRC32値 データの先頭から正順に求めたハッシュ値 データの末尾から逆順に求めたCRC32値 データの末尾から逆順に求めたハッシュ値 の4つを求めて、それらを「文字化」して、その「文字化した4つの文字列」を単純に連結した文字列をIDにする、など。 「CRC32関数」や「ハッシュ関数」は、googleなどで調べればすぐに見付かる筈です。
お礼
早速のご回答ありがとうございます! ハッシュ値やチェックサムなど、目から鱗が落ちました。 これで殆ど行けそうな感じなので、調べて検討してみたいと思います。 ただ、もうひとひねり、IDの衝突を避けるための仕掛けをプラスできると安心なのですが‥ カリフォルニアでジョンさんが撮った写真と、ムンバイでアショークさんが撮った写真が同一IDになってしまう気がするのです。
- t_ohta
- ベストアンサー率38% (5238/13705)
MD5とかSHAとか使ってハッシュ値を求める方法はどうでしょう。
お礼
早速のご回答ありがとうございます! ハッシュ値とは知りませんでしたので、とても助かりました。 調べて検討してみたいと思います。 ただ、IDの衝突を避けるための仕掛けがもう一つあると安心できるのですが‥
お礼
他のサイトで、 画像の全体の色味情報として、数ピクセル程度まで縮小した画像、 画像に含まれる形状の情報として、輪郭追跡より求めた曲線データ、 これらを数値化したものにハッシュ値を加えた、三要素をIDとする案が出てきましたので、 これにて質問を締め切りたいと思います。 皆様本当に有り難うございました。
補足
ご回答有り難うございます! 大変本質的なご指摘です。 それでは、衝突の許容度は、画像の内容によって変化する事にします。 人の目で見てどれも同じような場合、例えば、全面ノイズ画像などの場合には、衝突して構いません。 逆に、お気に入りの場所で撮った思い出の一枚が、全くの別画像に化けることは絶対に避けたいということにします。 比較する対象は、1ビット単位のデータ値ではなく、あくまでも人間が見る為の画像です。 どうぞ宜しくお願いします!