在做文件上传的过程中,有时需要我们将文件流加密保存一份存到数据库中,因为同样的文件流加密后的值是一定的,所以在上传的过程中可以通过先加密该文件流得到一个加密值,然后拿到这个加密值到数据库查找一下,如果存在,就不需要进行上传操作了,直接在数据库插入一条该文件的记录,将路径指向存在的路径即可。下面代码是通过MD5加密文件流对象C#代码:
[C#] 纯文本查看 复制代码 string hashMd5Vaules = string.Empty;
try
{
Stream stream = file.InputStream;
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
SHA1 sha1 = SHA1.Create();
var md5 = new MD5CryptoServiceProvider();
byte[] hashBytes = md5.ComputeHash(bytes);
for (int i = 0; i < hashBytes.Length; i++)
{
hashMd5Vaules += string.Format("{0:X}", hashBytes[i]);
}
hashMd5Vaules = hashMd5Vaules.ToLower().Substring(8, 16);//从索引8开始,取16位
}
catch { }
java语法:
[Java] 纯文本查看 复制代码 /***
* 把文件转化为字节数组
*
* @param i
* @return
*/
public byte[] file2byte(int i) {
byte[] buffer = null;
try {
FileInputStream fis = new FileInputStream(verifyUtils.getModificationFile(new File(IMGPathList.get(i))));
ByteArrayOutputStream bos = new ByteArrayOutputStream(1024);
byte[] b = new byte[1024];
int n;
while ((n = fis.read(b)) != -1) {
bos.write(b, 0, n);
}
fis.close();
bos.close();
buffer = bos.toByteArray();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return buffer;
}
/***
* 取图片的md5值,截取16个字符,进行存储。与后台对应
*
* @param i
* @return
*/
public String getMd5(int i) {
String ss = "";
byte[] bytes = file2byte(i);
try {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update(bytes);
byte[] digest = messageDigest.digest();
for (int j = 0; j < digest.length; j++) {
ss += String.format("%x", digest[j]);
}
// Log.v("sss--->", ss.substring(8, 24));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return ss.substring(8, 24);
}
这样C#和java加密后的值是一样的,由于MD5生成的是32位,我们直接取中间的16位,当然这个可以自己定义取任意位置。
|