1 /***
2 * Simple Web Spider - <http://simplewebspider.sourceforge.net/>
3 * Copyright (C) 2009 <berendona@users.sourceforge.net>
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18 package simplespider.simplespider.util;
19
20 import java.io.UnsupportedEncodingException;
21 import java.security.MessageDigest;
22 import java.security.NoSuchAlgorithmException;
23
24 public final class MD5 {
25 private static ThreadLocal<MessageDigest> MD5 = new ThreadLocal<MessageDigest>() {
26
27 @Override
28 protected MessageDigest initialValue() {
29 try {
30 return MessageDigest.getInstance("MD5");
31 } catch (final NoSuchAlgorithmException e) {
32 throw new RuntimeException("Failed to get MD5 digest instance", e);
33 }
34 }
35 };
36
37 public static final String encodeString(final String string) throws RuntimeException {
38 return encodeString(string, null);
39 }
40
41 /***
42 * * Retrieves a hexidecimal character sequence representing the MD5 * digest of the specified character sequence, using the specified * encoding
43 * to first convert the character sequence into a byte sequence. * If the specified encoding is null, then ISO-8859-1 is assumed * * @param string
44 * the string to encode. * @param encoding the encoding used to convert the string into the * byte sequence to submit for MD5 digest * @return a
45 * hexidecimal character sequence representing the MD5 * digest of the specified string * @throws HsqlUnsupportedOperationException if an MD5
46 * digest * algorithm is not available through the * java.security.MessageDigest spi or the requested * encoding is not available
47 */
48 public static final String encodeString(final String string, final String encoding) throws RuntimeException {
49 return StringUtils.bytesToHex(digestString(string, encoding), false);
50 }
51
52 /***
53 * * Retrieves a byte sequence representing the MD5 digest of the * specified character sequence, using the specified encoding to * first convert
54 * the character sequence into a byte sequence. * If the specified encoding is null, then ISO-8859-1 is * assumed. * * @param string the string to
55 * digest. * @param encoding the character encoding. * @return the digest as an array of 16 bytes. * @throws HsqlUnsupportedOperationException if
56 * an MD5 digest * algorithm is not available through the * java.security.MessageDigest spi or the requested * encoding is not available
57 */
58 public static byte[] digestString(final String string, String encoding) throws RuntimeException {
59 byte[] data;
60 if (encoding == null) {
61 encoding = "ISO-8859-1";
62 }
63 try {
64 data = string.getBytes(encoding);
65 } catch (final UnsupportedEncodingException x) {
66 throw new RuntimeException("Unsupported encoding: " + encoding, x);
67 }
68 return digestBytes(data);
69 }
70
71 /***
72 * * Retrieves a byte sequence representing the MD5 digest of the * specified byte sequence. * * @param data the data to digest. * @return the MD5
73 * digest as an array of 16 bytes. * @throws HsqlUnsupportedOperationException if an MD5 digest * algorithm is not available through the *
74 * java.security.MessageDigest spi
75 */
76 public static final byte[] digestBytes(final byte[] data) throws RuntimeException {
77 return MD5.get().digest(data);
78 }
79 }