1

私はかなり大きなサイトを運営しており、メンバーは毎日何千もの画像を追加しています。明らかに多くの重複があり、画像のアップロード中に署名または画像のハッシュを生成して保存できるかどうか疑問に思っていました。そして、誰かが写真をアップロードするたびに、この署名が既に存在するかどうかを確認し、この画像が既に存在することを示すエラーを発生させるだけです。この種のテクノロジーがasp.netにすでに存在するかどうかはわかりませんが、すでにそれを行っているtineye.comを知っています.

あなたが助けることができると思うなら、私はあなたの意見に感謝します.

クリス

4

5 に答える 5

2

興味があるかもしれないキーワードは知覚的ハッシュです。

于 2009-12-02T19:37:53.813 に答える
1

派生した HashAlgorithm を使用して、ファイルのバイト配列からハッシュを生成します。通常は MD5 が使用されますが、System.Security.Cryptography 名前空間で提供されるいずれかの代わりにこれを使用できます。これは、画像だけでなく、任意のバイナリに対して機能します。

多くのサイトでは、ファイルをダウンロードするときに MD5 ハッシュを提供して、ファイルが正しくダウンロードされたかどうかを確認します。たとえば、ISO CD/DVD イメージは、すべてを受け取ったときにバイトが欠落している可能性があります。ファイルをダウンロードしたら、そのハッシュを生成し、それがサイトに記載されているものと同じであることを確認します。すべてを比較すると、正確なコピーが得られます。

私はおそらくこれに似たものを使用します:

public static class Helpers
{
    //If you're running .NET 2.0 or lower, remove the 'this' keyword from the
    //method signature as 2.0 doesn't support extension methods.
    static string GetHashString(this byte[] bytes, HashAlgorithm cryptoProvider)
    {
        byte[] hash = cryptoProvider.ComputeHash(bytes);
        return Convert.ToBase64String(hash);
    }
}

必要:

using System.Security.Cryptography;

次を使用して呼び出します。

byte[] bytes = File.ReadAllBytes("FilePath");
string filehash = bytes.GetHashString(new MD5CryptoServiceProvider());

または、.NET 2.0 以下で実行している場合:

string filehash = Helpers.GetHashString(File.ReadAllBytes("FilePath"), new MD5CryptoServiceProvider());

衝突の可能性が非常に低いため、MD5 の代わりに別のハッシュ方法を使用することにした場合:

string filehash = bytes.GetHashString(new SHA1CryptoServiceProvider());

この方法では、has メソッドは暗号プロバイダー固有のものではなく、使用している暗号プロバイダーを変更したいと判断した場合は、別のものを cryptoProvider パラメーターに挿入するだけです。

渡すサービスプロバイダーを変更するだけで、他のハッシュクラスを使用できます。

string md5Hash = bytes.GetHashString(new MD5CryptoServiceProvider());
string sha1Hash = bytes.GetHashString(new SHA1CryptoServiceProvider());
string sha256Hash = bytes.GetHashString(new SHA256CryptoServiceProvider());
string sha384Hash = bytes.GetHashString(new SHA384CryptoServiceProvider());
string sha512Hash = bytes.GetHashString(new SHA512CryptoServiceProvider());
于 2009-12-02T19:19:05.740 に答える
1

System.Security.Cryptography 名前空間を調べます。いくつかのハッシュ アルゴリズム/実装から選択できます。これは md5 を使用した例ですが、これらが多数あるため、SHA1 のような大きなものが必要になる場合があります。

public byte[] HashImage(Stream imageData)
{
    return new MD5CryptoServiceProvider().ComputeHash(imageData);
} 
于 2009-12-02T19:22:00.250 に答える
1

通常、MD5 などを使用してハッシュを作成します。ただし、これが一意であるとは限らないため、ハッシュを出発点として使用することをお勧めします。画像が保存した既知のハッシュと一致するかどうかを特定し、一致するものを個別にロードし、潜在的な衝突について完全なバイト比較を行って確認します。

ただし、別のより簡単な手法は、少数のビットを選択して画像の最初の部分を読み取ることです...その数の開始ビットをハッシュのように保存します。これにより、チェックする必要がある潜在的な衝突の数は少なくなりますが、オーバーヘッドははるかに少なくなります。

于 2009-12-02T19:24:51.883 に答える
0

すでに存在するかどうかはわかりませんが、自分でこれを行うことができない理由は考えられません。これに似たものは、ファイルのハッシュを取得します。

var fileStream = Request.Files[0].InputStream;//the uploaded file
var hasher = System.Security.Cryptography.HMACMD5();
var theHash = hasher.ComputeHash(fileStream);

System.Security.Cryptography

于 2009-12-02T19:20:33.137 に答える