ps:这几天本人用百度云盘秒传了几部大片到云盘上,几个G的文件瞬秒竟然显示“上传成功”!这真让我目瞪口呆,要是这样的话,那得多快的网速,这绝对是不可能的,也许这仅是个假象。百度了一下才发现所谓的“秒传”是常见的“忽略式”上传方式,就是您上传了一个文件名为111.exe,MD5为一个数,有一个网友以前也上传一个叫222.exe,MD5和您上传的文件MD5码一模一样,所以这个文件上传到服务器上的时间就很短了,这是因为别人上传过这个文件,您上传这个文件,服务器上有这个文件了,所以只需要把这个文件复制一份到您的网盘上就可以了。

秒传的原理详细解释  

上传到网盘的每个文件,服务器都会校验MD5码。如果这个您上传的文件MD5码与已经存在于服务器里的文件的MD5码相同的话,网盘服务器将会判断成为重复文件,只需要复制副本保存在网盘上即可,无需重新保存,因为有过目前这个文件,于是很快完成上传任务,并在有人需要下载的时候将原有的该文件的下载地址放出。这样实现了服务器的高效运作。

怎样不秒传?  

把你要上传的东西压缩成RAR,东西上传,服务器会先做MD5校验,如果服务器上有一样的东西,它就直接给你个新地址,其实你下载的都是服务器上的同一个文件,想要不秒传,其实只要让MD5改变,就是对文件本身做一下修改(改名字不行),例如一个文本文件,你多加几个字,MD5就变了,就不会秒传了。  但是有些文件我们不好改变,也不想改变,那其实只要压缩一下,MD5就变了,而下载的人也能获得最原始的资料,不过就是加压要花费一点时间。

下面来学习学习MD5的相关知识,MD5 即Message-Digest Algorithm 5(信息-摘要算法5 ),是一种用于产生数字签名的单项散列算 法,在1991年由MIT Laboratory for Computer Science(MIT计算机科学实验室)和RSA Data Security Inc(RSA数据安全公司)的Ronald L. Rivest教授开发出来,经由MD2、MD3和MD4发展而来。MD5算法的使用不需要支付任何版权费用。它的作用是让大容量信息在用数字签名软件签私人密匙前被"压缩"成一种保密的格式(将一个任意长度的“字节串”通过一个不可逆的字符串变换算法变换成一个128bit的大整数
,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。)

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

Java已经实现了MD5、SHA1算法。利用java.security.MessageDigest类就可以获取字符串和文件的MD5以及SHA1结果下面是一个工具类,可以获取字符串和文件进行MD5值。

  1. import java.io.FileInputStream;
  2. import java.security.DigestInputStream;
  3. import java.security.MessageDigest;
  4. /**
  5. * MD5工具类,获取字符串或者文件的MD5值
  6. * @author ouyangpeng
  7. * @link http://blog.csdn.net/ouyang_peng
  8. */
  9. public class MD5Utils {
  10. /**
  11. * 通过MD5加密字符串
  12. * @param HASH_ALGORITHM
  13. * 加密算法,可以是MD5,SHA1
  14. * @param input
  15. * 字符串
  16. * @return 已经通过MD5算法加密的32位字符串
  17. */
  18. public final static String stringToMD5(String input) {
  19. try {
  20. // 拿到一个MD5转换器,如果想要SHA1参数换成”SHA1”)
  21. MessageDigest messageDigest = MessageDigest.getInstance("MD5");
  22. // 输入的字符串转换成字节数组
  23. byte[] inputByteArray = input.getBytes();
  24. // inputByteArray是输入字符串转换得到的字节数组
  25. messageDigest.update(inputByteArray);
  26. // 转换并返回结果,也是字节数组,包含16个元素
  27. byte[] resultByteArray = messageDigest.digest();// MD5 的计算结果是一个 128 位的长度整数,
  28. // 字符数组转换成字符串返回
  29. return byteArrayToHex(resultByteArray);
  30. } catch (Exception e) {
  31. e.printStackTrace();
  32. }
  33.  
  34. return null;
  35. }
  36.  
  37. /**
  38. * 通过MD5加密文件
  39. * @param inputFile 文件路径
  40. * @return 已经通过MD5算法加密的32位字符串
  41. */
  42. public final static String fileToMD5(String inputFile) {
  43. int bufferSize = 256 * 1024;// 定义缓冲区大小
  44. FileInputStream fileInputStream = null;
  45. DigestInputStream digestInputStream = null;
  46. try {
  47. MessageDigest messageDigest = MessageDigest.getInstance("MD5");
  48. fileInputStream = new FileInputStream(inputFile);
  49. digestInputStream = new DigestInputStream(fileInputStream, messageDigest);
  50. byte[] buffer = new byte[bufferSize];
  51. while (digestInputStream.read(buffer) > 0)
  52. ;
  53. messageDigest = digestInputStream.getMessageDigest();
  54. byte[] resultByteArray = messageDigest.digest();
  55. return byteArrayToHex(resultByteArray);
  56. } catch (Exception e) {
  57. } finally {
  58. try {
  59. digestInputStream.close();
  60. } catch (Exception e2) {
  61. }
  62. }
  63. return null;
  64. }
  65.  
  66. /**
  67. * @param byteArray
  68. * byte数组
  69. * @return 转后后的32位的字符串
  70. */
  71. private static String byteArrayToHex(byte[] byteArray) {
  72. // 首先初始化一个字符数组,用来存放每个16进制字符
  73. char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
  74.  
  75. // new一个字符数组,这个就是用来组成结果字符串的(解释一下:一个byte是八位二进制,也就是2位十六进制字符(2的8次方等于16的2次方))
  76. char[] resultCharArray = new char[byteArray.length * 2];// 每个字节用 16 进制表示的话,使用两个字符
  77.  
  78. // 遍历字节数组,通过位运算(位运算效率高),转换成字符放到字符数组中去
  79. int index = 0;
  80. // 从第一个字节开始,对MD5的每一个字节转换成16进制字符的转换
  81. for (byte b : byteArray) {
  82. // 取字节中高 4 位的数字转换
  83. //>>> 为逻辑右移(即无符号右移),将符号位一起右移
  84. resultCharArray[index++] = hexDigits[b >>> 4 & 0xf];
  85. // 取字节中低4位的数字转换
  86. resultCharArray[index++] = hexDigits[b & 0xf];
  87. }
  88. // 字符数组组合成字符串返回
  89. return new String(resultCharArray);
  90. }
  91. }

下面是一个测试类,用于测试上面的MD5工具类是否有用

  1. class MD5Test{
  2. public static void main(String[] args) {
  3. System.out.println(MD5Utils.stringToMD5("OuyangPeng"));
  4. long startTime = System.currentTimeMillis();
  5. System.out.println(MD5Utils.fileToMD5("/home/ouyangpeng/Android/CanplayComp/Code.tar.gz"));//9.6G的文件
  6. long endTime = System.currentTimeMillis();
  7. System.out.println("Time:" + (endTime - startTime) / 1000);
  8. }
  9. }

测试结果如下:

  1. 30A81CB758C6918C7E43513839002171
  2. 05924A988C096A50B9BD4FA2AD7FA733
  3. Time:86

参考链接:

  1. http://blog.csdn.net/xiao__gui/article/details/8148203
  2. http://baike.baidu.co/link?url=1IssoIidKtoOPvWnNHn4HaKsjYy7s4q85qO7uwrhxWA0mXxoiY3-84mss_wdGWpi

====================================================================================

  作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址:http://blog.csdn.net/ouyang_peng

===================================================================================

我的Java开发学习之旅------>工具类:Java获取字符串和文件进行MD5值的更多相关文章

  1. 我的Java开发学习之旅------>工具类:将播放器的进度值转换成相应的时间格式

    在我的博客<我的Java开发学习之旅------>Java 格式化类(java.util.Formatter)基本用法,地址:http://blog.csdn.net/ouyang_pen ...

  2. 我的Java开发学习之旅------>工具类:Java使用正则表达式分离出字符串中的中文和英文

    今天看到一个工具类使用正则表达式将一大段字符串中的中文和英文都分离出来了,在此记录一下,读者可以收藏! import java.util.ArrayList; import java.util.Col ...

  3. 我的Java开发学习之旅------>Java 格式化类(java.util.Formatter)基本用法

    本文参考: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html http://www.blogjava.net/ ...

  4. 我的Java开发学习之旅------>在Dos环境下Java内部类的编译和运行

    习惯了在IDE工具上进行代码编写,连最基本的Javac命令和Java命令都忘记的差不多了,今天对一个Java内部类进行编译和运行的时候,就出糗了.IDE是把双刃剑,它可以什么都帮你做了,你只要敲几行代 ...

  5. Java 开发环境配置--eclipse工具进行java开发

    Java 开发环境配置 在本章节中我们将为大家介绍如何搭建Java开发环境. Windows 上安装开发环境 Linux 上安装开发环境 安装 Eclipse 运行 Java Cloud Studio ...

  6. JAVA基础学习day18--常用工具类

    一.System 1.1.概述 System 类包含一些有用的类字段和方法.它不能被实例化. 在 System 类提供的设施中,有标准输入.标准输出和错误输出流:对外部定义的属性和环境变量的访问:加载 ...

  7. JAVA基础学习day17--集合工具类-Collections

    一.Collection简述 1.1.Collection与Collections的区别 Collections是集合的静态工具类 Collection:是集合的顶级接口 二.Sort 2.1.sor ...

  8. 我的Java开发学习之旅------&gt;Base64的编码思想以及Java实现

    Base64是一种用64个字符来表示随意二进制数据的方法. 用记事本打开exe.jpg.pdf这些文件时,我们都会看到一大堆乱码,由于二进制文件包括非常多无法显示和打印的字符.所以,假设要让记事本这种 ...

  9. 我的Java开发学习之旅------>Java利用Comparator接口对多个排序条件进行处理

    一需求 二实现Comparator接口 三验证排序结果 验证第一条件首先按级别排序级别最高的排在前面 验证第二条如果级别相等那么按工资排序工资高的排在前面 验证第三条如果工资相当则按入职年数排序入职时 ...

随机推荐

  1. linux 项目管理、服务器管理、服务器维护

    代码打包:tar -zcvf ImOra.3.2.6.tgz --exclude=Public/.htaccess --exclude=Apps/Demo Apps/ Config/ Shell/ L ...

  2. SecureCRT保持连接,不会过一段时间关闭Session

    [Options]->[Global Options]->[General]->[Default Session]点击[Edit default settings]按钮,在[Term ...

  3. Atom打开大文件卡死的问题替代方案

    无解,本身是网页的框架,所以直接换回ST或者Notepad++吧.

  4. Linux shell 提取文件名和目录名的一些方法(转)

    很多时候在使用Linux的shell时,我们都需要对文件名或目录名进行处理,通常的操作是由路径中提取出文件名,从路径中提取出目录名,提取文件后缀名等等.例如,从路径/dir1/dir2/file.tx ...

  5. Android 监听双卡信号强度(附完整代码)

    Android 监听双卡信号强度 监听单卡信号强度 监听单卡的信号强度非常简单直接用TelephonyManager.listen()去监听sim卡的信号强度. TelephonyManager = ...

  6. Android HAL实例解析

    一.概述 本文希望通过分析台湾的Jollen的mokoid 工程代码,和在s5pc100平台上实现过程种遇到的问题,解析Andorid HAL的开发方法. 二.HAL介绍 现有HAL架构由Patric ...

  7. opencv-2.4.11编译备忘

    编译完成后,想测试example中例子,但是由于没有sudo权限,不能运行pkg-config查看opencv的--cflags和--libs. 记录一下,备忘: pkg-config --libs ...

  8. [Golang] 从零開始写Socket Server(2): 自己定义通讯协议

    在上一章我们做出来一个最基础的demo后,已经能够初步实现Server和Client之间的信息交流了~ 这一章我会介绍一下怎么在Server和Client之间实现一个简单的通讯协议.从而增强整个信息交 ...

  9. Web安全系列(二):XSS 攻击进阶(初探 XSS Payload)

    什么是 XSS Payload 上一章我谈到了 XSS 攻击的几种分类以及形成的攻击的原理,并举了一些浅显的例子,接下来,我就阐述什么叫做 XSS Payload 以及从攻击者的角度来初探 XSS 攻 ...

  10. LM339组成的双限比较器

    通常是上限电压值与电源电压Vcc接近,下限电压值靠近0V.