使用MD5对每个图片进行MD5的计算,生成一个值。
import java.io.*; import java.math.BigInteger; import java.net.HttpURLConnection; import java.net.URL; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * Created by XXX on 2018/8/22. */ public class GetPictureHash { /** * @param @param url 图片的连接地址 * @param @throws IOException * @throws * @Title: getImg * @Description: 通过一个url 去获取图片 */ public static void getImg(String url) throws IOException, NoSuchAlgorithmException { long startTime = System.currentTimeMillis(); MessageDigest md = MessageDigest.getInstance("MD5"); URL imgURL = new URL(url.trim());//转换URL HttpURLConnection urlConn = (HttpURLConnection) imgURL.openConnection();//构造连接 urlConn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36"); urlConn.connect(); System.out.println(GetPictureHash.class.toString() + ":获取连接=" + urlConn.getResponseMessage()); if (urlConn.getResponseCode() == 200) {//返回的状态码是200 表示成功 InputStream ins = urlConn.getInputStream(); //获取输入流,从网站读取数据到 内存中 OutputStream out = new BufferedOutputStream(new FileOutputStream(new File("TEST.jpg"))); int len = 0; byte[] buff = new byte[1024 * 10];//10k缓冲流 视你内存大小而定咯 while (-1 != (len = (new BufferedInputStream(ins)).read(buff))) {//长度保存到len,内容放入到 buff out.write(buff, 0, len);//将图片数组内容写入到图片文件 md.update(buff, 0, len); // System.out.println(GetPictureHash.class.toString() + ":" + len + "byte已经写入到文件中,内容: " + new String(buff)); } //转换并返回包含16个元素字节数组,返回数值范围为-128到127 byte[] md5Bytes = md.digest(); BigInteger bigInt = new BigInteger(1, md5Bytes);//1代表绝对值 System.out.println(bigInt); urlConn.disconnect(); ins.close(); out.close(); System.out.println(GetPictureHash.class.toString() + ":获取图片完成,耗时=" + ((System.currentTimeMillis() - startTime) / 1000) + "s"); } } /** * @throws IOException * @throws * @Title: main * @Description: 测试方法 */ public static void main(String[] args) throws IOException, NoSuchAlgorithmException { GetPictureHash.getImg("https://static.mifanxing.com/yyren/wx/image/249/3/260557.jpg"); GetPictureHash.getImg("https://static.mifanxing.com/yyren/wx/image/0/4/262218.jpg"); } public static String md5HashCode(InputStream fis) { try { //拿到一个MD5转换器,如果想使用SHA-1或SHA-256,则传入SHA-1,SHA-256 MessageDigest md = MessageDigest.getInstance("MD5"); //分多次将一个文件读入,对于大型文件而言,比较推荐这种方式,占用内存比较少。 byte[] buffer = new byte[1024]; int length = -1; while ((length = fis.read(buffer, 0, 1024)) != -1) { md.update(buffer, 0, length); } fis.close(); //转换并返回包含16个元素字节数组,返回数值范围为-128到127 byte[] md5Bytes = md.digest(); BigInteger bigInt = new BigInteger(1, md5Bytes);//1代表绝对值 return bigInt.toString(16);//转换为16进制 } catch (Exception e) { e.printStackTrace(); return ""; } } /** * java计算文件32位md5值 * @param fis 输入流 * @return */ public static String md5HashCode32(InputStream fis) { try { //拿到一个MD5转换器,如果想使用SHA-1或SHA-256,则传入SHA-1,SHA-256 MessageDigest md = MessageDigest.getInstance("MD5"); //分多次将一个文件读入,对于大型文件而言,比较推荐这种方式,占用内存比较少。 byte[] buffer = new byte[1024]; int length = -1; while ((length = fis.read(buffer, 0, 1024)) != -1) { md.update(buffer, 0, length); } fis.close(); //转换并返回包含16个元素字节数组,返回数值范围为-128到127 byte[] md5Bytes = md.digest(); StringBuffer hexValue = new StringBuffer(); for (int i = 0; i < md5Bytes.length; i++) { int val = ((int) md5Bytes[i]) & 0xff;//解释参见最下方 if (val < 16) { /** * 如果小于16,那么val值的16进制形式必然为一位, * 因为十进制0,1...9,10,11,12,13,14,15 对应的 16进制为 0,1...9,a,b,c,d,e,f; * 此处高位补0。 */ hexValue.append("0"); } //这里借助了Integer类的方法实现16进制的转换 hexValue.append(Integer.toHexString(val)); } return hexValue.toString(); } catch (Exception e) { e.printStackTrace(); return ""; } } }