在对一些长短不一的字符串或者其他数据做保存的时候,都希望他们能够有一个具有唯一性而且统一的保存方式,比如我在做网络数据缓存的时候,希望以该数据的url来作为本地缓存文件的名称,但是url有时候长短不一,也许会超过文件名的长短限制,有些又很短,不一定达到长度需求,所以这里封装了一个获取String的MD5值的API,也许以后会用到,所以记录下来.
package javatest;
public class MD5 {
public static String getMD5(String instr) {
String s = null;
// 用来将字节转换成 16 进制表示的字
char hexDigits[] = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f'
};
try {
java.security.MessageDigest md = java.security.MessageDigest
.getInstance("MD5");
md.update(instr.getBytes());
byte tmp[] = md.digest(); // MD5 的计算结果是 128 位的长整数,
// 用字节表示就16 个字
char str[] = new char[16 * 2]; // 每个字节16 进制表示的话,使用两个字符,
// 表示16 进制32 个字
int k = 0; // 表示转换结果中对应的字符位置
for (int i = 0; i < 16; i++) { //
byte byte0 = tmp[i]; // 取第 i 个字
str[k++] = hexDigits[byte0 >>> 4 & 0xf]; // 取字节中4 位的数字转换,
// >>>
// 右移,将符号位右移
str[k++] = hexDigits[byte0 & 0xf]; // 取字节中4 位的数字转换
}
s = new String(str).toUpperCase(); // 换后的结果转换为字符
} catch (Exception e) {
}
return s;
}
}
下面是使用的方法,很简单:
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
File f = new File(Environment.getExternalStorageDirectory()+"/TestSyncListView/"+MD5.getMD5(url));
if(f.exists()){
FileInputStream fis = new FileInputStream(f);
Drawable d = Drawable.createFromStream(fis, "src");
return d;
}