# md5 berechnen für BufferedImage



## DerKleineMuck (12. Jul 2011)

Hi,

ich habe einen hier gefundenen md5 Algorithmus umgebastelt:

```
private byte[] createChecksum(BufferedImage fileImg) throws Exception {
		InputStream fis =  ???;
		byte[] buffer = new byte[1024];
		MessageDigest complete = MessageDigest.getInstance("MD5");
		int numRead;
		do {
			numRead = fis.read(buffer);
			if (numRead > 0) {
				complete.update(buffer, 0, numRead);
		 	}
	 	} while (numRead != -1);
		fis.close();
		return complete.digest();
	}    
    
	private String getMD5Checksum(BufferedImage fileImg) throws Exception {
		byte[] b = createChecksum(fileImg);
		String result = "";
		for (int i=0; i < b.length; i++) {
			result +=
				Integer.toString( ( b[i] & 0xff ) + 0x100, 16).substring( 1 );
		}
		return result;
	}
```
Dort wo die drei Fragezeichen stehen fehlt der Teil wo ich das BufferedImage in einen InputStream bekommen muss. Hat da Jemand eine Lösung?

Grüße Markus


----------



## Ariol (12. Jul 2011)

```
private byte[] createChecksum(byte[] inBytes) throws Exception {
		InputStream fis = new ByteArrayInputStream(inBytes);
		byte[] buffer = new byte[1024];
		MessageDigest complete = MessageDigest.getInstance("MD5");
		int numRead;
		do {
			numRead = fis.read(buffer);
			if (numRead > 0) {
				complete.update(buffer, 0, numRead);
			}
		} while (numRead != -1);
		fis.close();
		return complete.digest();
	}
	
	private byte[] createChecksum(BufferedImage fileImg) throws Exception {
		return createChecksum(((DataBufferByte)fileImg.getData().getDataBuffer()).getData());
		
	}

	private String getMD5Checksum(BufferedImage fileImg) throws Exception {
		byte[] b = createChecksum(fileImg);
		String result = "";
		for (int i = 0; i < b.length; i++) {
			result += Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1);
		}
		return result;
	}
```


----------



## Ariol (12. Jul 2011)

VIEL kürzere Version:

```
private byte[] createChecksum(BufferedImage fileImg) throws Exception {
		MessageDigest complete = MessageDigest.getInstance("MD5");
		byte[] inBytes = ((DataBufferByte)fileImg.getData().getDataBuffer()).getData();
		complete.update(inBytes, 0, inBytes.length);
		return complete.digest();
	}

	private String getMD5Checksum(BufferedImage fileImg) throws Exception {
		byte[] b = createChecksum(fileImg);
		StringBuilder result = new StringBuilder();
		for (int i = 0; i < b.length; i++) {
			result.append(String.format("%02x",b[i]));
		}
		return result.toString();
	}
```


----------



## turtle (12. Jul 2011)

:meld:Kurze Anmerkung zur Konvertierung in Hexadezimal:


```
String md5Hash = (new BigInteger(1, b)).toString(16);
```
statt 


> StringBuilder result = new StringBuilder();
> for (int i = 0; i < b.length; i++) {
> result.append(String.format("%02x",b_));
> }
> _


----------



## Ariol (12. Jul 2011)

turtle hat gesagt.:


> :meld:Kurze Anmerkung zur Konvertierung in Hexadezimal:
> 
> 
> ```
> ...



Wieder was gelernt. Danke 


Nochmal kürzer:

```
private String getMD5Checksum(BufferedImage fileImg) throws Exception {
	byte[] inBytes = ((DataBufferByte)fileImg.getData().getDataBuffer()).getData();
	MessageDigest complete = MessageDigest.getInstance("MD5");
	complete.update(inBytes, 0, inBytes.length);
	return new BigInteger(1, complete.digest()).toString(16);
}
```
Ist allerdings auch nicht gut wiederverwendbar...


----------



## gman (12. Jul 2011)

Falls du es nicht unbedingt selber machen musst nutze doch einfach Apache-Commons-Codec:


```
String md5hex = DigestUtils.md5Hex(byte[] data);
```


----------

