b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

android MD5校验码的生成与算法实现

电脑杂谈  发布时间:2016-05-20 13:02:29  来源:网络整理

你是否正在寻找关于md5校验码的内容?让我把最实时的东西奉献给你:

在Java中,java.security.MessageDigest (rt.jar中)已经定义了 MD5 的计算,所以我们只需要简单地调用即可得到 MD5 的128 位整数。然后将此 128 位计 16 个字节转换成 16 进制表示即可。

下面是一个可生成字符串或文件md5校验码的例子,测试过,可当做工具类直接使用,其中最主要的是getMD5String(String s)和getFileMD5String(File file)两个方法,分别用于生成字符串的md5校验值和生成文件的md5校验值,getFileMD5String_old(File file)方法可删除,不建议使用:

package com.why.md5; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5Util { /** * 默认的密码字符串组合,用来将字节转换成 16 进制表示的字符,apache校验下载的文件的正确性用的就是默认的这个组合 */ protected static char hexDigits[] = { '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , 'a' , 'b' , 'c' , 'd' , 'e' , 'f' }; protected static MessageDigest messagedigest = null ; static { try { messagedigest = MessageDigest.getInstance("MD5" ); } catch (NoSuchAlgorithmException nsaex) { System.err.println(MD5Util.class .getName() + "初始化失败,MessageDigest不支持MD5Util。" ); nsaex.printStackTrace(); } } /** * 生成字符串的md5校验值 * * @param s * @return */ public static String getMD5String(String s) { return getMD5String(s.getBytes()); } /** * 判断字符串的md5校验码是否与一个已知的md5码相匹配 * * @param password 要校验的字符串 * @param md5PwdStr 已知的md5校验码 * @return */ public static boolean checkPassword(String password, String md5PwdStr) { String s = getMD5String(password); return s.equals(md5PwdStr); } /** * 生成文件的md5校验值 * * @param file * @return * @throws IOException */ public static String getFileMD5String(File file) throws IOException { InputStream fis; fis = new FileInputStream(file); byte [] buffer = new byte [ 1024 ]; int numRead = 0 ; while ((numRead = fis.read(buffer)) > 0 ) { messagedigest.update(buffer, 0 , numRead); } fis.close(); return bufferToHex(messagedigest.digest()); } /** * JDK1.4中不支持以MappedByteBuffer类型为参数update方法,并且网上有讨论要慎用MappedByteBuffer, * 原因是当使用 FileChannel.map 方法时,MappedByteBuffer 已经在系统内占用了一个句柄, * 而使用 FileChannel.close 方法是无法释放这个句柄的,且FileChannel有没有提供类似 unmap 的方法, * 因此会出现无法删除文件的情况。 * * 不推荐使用 * * @param file * @return * @throws IOException */ public static String getFileMD5String_old(File file) throws IOException { FileInputStream in = new FileInputStream(file); FileChannel ch = in.getChannel(); MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, 0 , file.length()); messagedigest.update(byteBuffer); return bufferToHex(messagedigest.digest()); } public static String getMD5String( byte [] bytes) { messagedigest.update(bytes); return bufferToHex(messagedigest.digest()); } private static String bufferToHex( byte bytes[]) { return bufferToHex(bytes, 0 , bytes.length); } private static String bufferToHex( byte bytes[], int m, int n) { StringBuffer stringbuffer = new StringBuffer( 2 * n); int k = m + n; for ( int l = m; l < k; l++) { appendHexPair(bytes[l], stringbuffer); } return stringbuffer.toString(); } private static void appendHexPair( byte bt, StringBuffer stringbuffer) { char c0 = hexDigits[(bt & 0xf0 ) >> 4 ]; // 取字节中高 4 位的数字转换, >>> 为逻辑右移,将符号位一起右移,此处未发现两种符号有何不同 char c1 = hexDigits[bt & 0xf ]; // 取字节中低 4 位的数字转换 stringbuffer.append(c0); stringbuffer.append(c1); } public static void main(String[] args) throws IOException { long begin = System.currentTimeMillis(); File file = new File( "C:/12345.txt" ); String md5 = getFileMD5String(file); // String md5 = getMD5String("a"); long end = System.currentTimeMillis(); System.out.println("md5:" + md5 + " time:" + ((end - begin) / 1000 ) + "s" ); } }

MD5的全称是Message-digest Algorithm 5(信息-摘要算法),用于确保信息传输完整一致。90年代初由MIT的计算机科学实验室和RSA Data Security Inc的Ronald L. Rivest开发出来,经MD2、MD3和MD4发展而来。

任何一个字符串或文件,无论是可执行程序、图像文件、临时文件或者其他任何类型的文件,也不管它体积多大,都有且只有一个独一无二的MD5信息码,并且如果这个文件被修改过,它的MD5码也将随之改变。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-5640-1.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...