我运行一个相当大的网站,我的会员,每天增加数千张图片。显然,有很多重复的,我只是想知道如果图像的上传过程中我能以某种方式生成图像的签名或哈希这样我就可以保存它。而每一次有人上传图片我想简单地运行检查,如果此签名已经存在,并且触发一个错误,指出这一形象已经存在。不知道这种技术已经存在,asp.net,但我知道这tineye.com样的呢,它已经的。

如果你认为你可以帮助我将不胜感激您的意见。

克里斯

有帮助吗?

解决方案

您使用任何衍生的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());

这样,你有方法不加密提供具体,如果你要决定你想改变你使用,你只要注入不同的一进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());

其他提示

通常你只需要使用MD5或类似建立一个哈希值。这并不能保证是唯一的,所以我建议你使用hash作为一个起点。确定如果图像匹配您存储任何已知的哈希值,然后分别装入它匹配的人,做对潜在的冲突的完整字节的比较是肯定的。

另一种更简单的技术虽然是简单地挑比特的短小号和读取的图像的第一部分...存储该号码就好像它们是一散列起始位。这仍然给你一个小数字,你需要检查潜在的冲突的,但要少得多的开销。

查找范围的System.Security.Cryptography命名空间。你有你的几个哈希算法/实现的选择。下面是一个使用MD5的例子,但因为你有很多的这些,你可能要像SHA1更大的东西:

public byte[] HashImage(Stream imageData)
{
    return new MD5CryptoServiceProvider().ComputeHash(imageData);
} 

我不知道如果它已经存在或没有,但我想不出有任何理由,你不能这样做自己。类似的事情这将让你的文件的哈希值。

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

System.Security.Cryptography

这可能是感兴趣的关键字是 感知散列

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top