Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java,将传入的附件与数据库中的图像列表进行比较,看看是否相同_Java_Sql_Image - Fatal编程技术网

Java,将传入的附件与数据库中的图像列表进行比较,看看是否相同

Java,将传入的附件与数据库中的图像列表进行比较,看看是否相同,java,sql,image,Java,Sql,Image,在一个系统中,我们自动获取电子邮件,并将这些电子邮件中的附件保存在数据库中。 现在,客户希望能够不保存某些图像,如横幅等,以便一次又一次地保存 我需要一种在数据库中创建图像“黑名单”的方法,并将这些图像与传入的附件进行比较 这是附件保存到数据库的方式 .... InputStream is = new BufferedInputStream(new FileInputStream(attachment)); preparedStatement.setBinaryStream(5

在一个系统中,我们自动获取电子邮件,并将这些电子邮件中的附件保存在数据库中。 现在,客户希望能够不保存某些图像,如横幅等,以便一次又一次地保存

我需要一种在数据库中创建图像“黑名单”的方法,并将这些图像与传入的附件进行比较

这是附件保存到数据库的方式

   ....
   InputStream is = new BufferedInputStream(new FileInputStream(attachment));
   preparedStatement.setBinaryStream(5,is,(int)filesize);
   ....
   pstmt.executeUpdate(); 
在数据库中,它们被保存为图像,看起来像0xFFD8FFE0000104A4649460001010000010000010000

从数据库中读取一些这样的图像并查看其中是否有与传入附件相同的图像,有什么简单的方法


请注意,这是一个相当复杂的系统,我现在无法重建。因此,任何关于将图像存储在文件夹中而不是数据库或类似内容中的建议现在对我都没有帮助。

不要直接比较图像,请比较哈希代码。如果您使用像这样的散列函数,您可以非常自信(*)没有冲突,并且您将把正确的图像列入黑名单

其基本思想是:在读取图像时,还可以使用
MessageDigest

MessageDigest digest = MessageDigest.getInstance("SHA-256");

// call digest.update(byte[]) for all the chunks of the file

byte[] hash = digest.digest();
然后可以比较散列。如果在将其存储到数据库之前将其转换为Base64字符串,则可以在SQL语句或Java代码中使用普通字符串比较:

import org.apache.commons.codec.binary.Base64;

byte[] encodedBytes = Base64.encodeBase64(hash);
System.out.println("encodedBytes " + new String(encodedBytes));
注意:您的黑名单可能仍然无法按您的预期工作。用户只需稍微更改图片的一个像素,您就不会再在黑名单中找到它了。您可能会比较图像的相似性。这要困难得多,也要耗费更多的时间

另请参见:



(*)如中所述,假阳性的几率很低,甚至不用费心去想。

我建议您使用像LIRE这样的图像哈希器。有了这个库,您可以获得一个散列,然后比较它们(欧几里德距离)。考虑到图像之间的相似性,可以丢弃不相等但真正相似的图像。 以下是说明的链接:

下面是代码的链接:


由于图像数据类型是二进制的,并且存储数据的空间很大,因此IMO比较图像字段的最简单方法是哈希比较。所以您需要在表中存储Photo列的散列

图像以二进制形式存储在数据库中,如果您想开发这个比较黑名单系统,那么最好的方法就是比较哈希。基本上,您需要将所有图像的散列存储在一列中,从中可以比较任何传入图像的散列。
按名称进行比较效率不高,因为名称可能会更改。

比较每种(或任何类型的散列)的md5?只是想一想……谢谢,但我不太明白//调用摘要.update(byte[])部分,对于文件中的所有块,我到底应该摘要什么?我可以直接处理文件还是输入流或其他什么吗?@Johannes我已经添加了一个指向“另请参阅”部分的链接,您可以在其中查看如何创建文件摘要。基本上,您必须以1024(或2048或…)字节的块读取整个文件,并每次更新摘要对象。希望有帮助。linke中的代码使用MD5,但它也可以与SHA-256一起使用。