HashCode md5 = Files.hash(file, Hashing.md5());
byte[] md5Bytes = md5.asBytes();
String md5Hex = md5.toString();
HashCode crc32 = Files.hash(file, Hashing.crc32());
int crc32Int = crc32.asInt();
// the Checksum API returns a long, but it's padded with 0s for 32-bit CRC
// this is the value you would get if using that API directly
long checksumResult = crc32.padToLong();
public static HashCode hash(File file,
HashFunction hashFunction)
throws IOException
Computes the hash code of the file using hashFunction.
Parameters:
file - the file to read
hashFunction - the hash function to use to hash the data
Returns:
the HashCode of all of the bytes in the file
Throws:
IOException - if an I/O error occurs
Since:
12.0
21 回答
有一个输入流装饰器,
java.security.DigestInputStream
,这样您就可以像往常一样使用输入流来计算摘要,而不必对数据进行额外的传递 .使用Apache Commons Codec库中的DigestUtils:
在Real's Java-How-to使用MessageDigest类有一个例子 .
使用CRC32和SHA-1检查该页面的示例 .
com.google.common.hash API提供:
用于所有散列函数的统一用户友好API
murmur3的可种子32位和128位实现
md5(),sha1(),sha256(),sha512()适配器,只更改一行代码以在这些之间切换,并且杂音 .
goodFastHash(int bits),用于何时不关心您使用的算法
HashCode实例的常规实用程序,如combineOrdered / combineUnordered
阅读用户指南(IO Explained,Hashing Explained) .
对于您的用例Files.hash()计算并返回文件的摘要值 .
例如sha-1摘要计算(将SHA-1更改为MD5以获取MD5摘要)
请注意crc32比md5快得多,因此如果您不需要加密安全校验和,请使用crc32 . 另请注意,md5不应用于存储密码等,因为它易于暴力破解,因为密码使用bcrypt,scrypt或sha-256 .
对于带有哈希的长期保护,安全性增加了,欧洲委员会赞助的后量子密码学研究小组建议使用这种密码技术来长期保护量子计算机(ref) .
请注意,crc32的碰撞率高于其他碰撞率 .
使用nio2(Java 7)而没有外部库:
要将结果与预期的校验和进行比较:
Guava现在提供了一种新的,一致的哈希API,它比JDK中提供的各种哈希API更加用户友好 . 见Hashing Explained . 对于文件,您可以轻松获得MD5总和,CRC32(版本14.0)或许多其他哈希值:
好 . 我不得不补充一下 . 对于已经拥有Spring和Apache Commons依赖关系或计划添加它的人来说,一行实现:
For和Apache commons only选项(credit @duleshi):
希望这有助于某人 .
一种简单的方法,没有使用Java 7的第三方库
如果需要打印此字节数组 . 使用方法如下
如果你需要这个摘要中的十六进制字符串 . 使用方法如下
其中DatatypeConverter是javax.xml.bind.DatatypeConverter
我最近不得不为一个动态字符串执行此操作,
MessageDigest
可以通过多种方式表示哈希 . 要获得文件的签名,就像使用 md5sum 命令一样,我必须做类似这样的事情:这显然没有回答你关于如何专门为文件做这个问题的问题,上面的答案很好地解决了这个问题 . 我花了很多时间把这笔钱看起来像大多数应用程序显示它,并认为你可能遇到同样的麻烦 .
或者你可能会得到更多信息http://www.asjava.com/core-java/java-md5-example/
非常快速和干净的Java方法,不依赖于外部库:
(如果需要,只需将MD5替换为SHA-1,SHA-256,SHA-384或SHA-512)
我们使用的代码类似于上一篇文章中的代码
但是,请注意在这里使用
BigInteger.toString()
,因为它将截断前导零...(例如,尝试s = "27"
,校验和应为"02e74f10e0327ad868d138f2b4fdd6f0"
)我的第二个建议是使用Apache Commons Codec,我用它替换了我们自己的代码 .
另一种实施方式:Fast MD5 Implementation in Java
Standard Java Runtime Environment way:
结果等于linux md5sum实用程序 .
这是一个简单的函数,它包含Sunil的代码,因此它将File作为参数 . 该函数不需要任何外部库,但它确实需要Java 7 .
示例输出:
如果您正在使用ANT进行构建,那么这很简单 . 添加以下内容你的build.xml:
其中jarFile是要生成MD5的JAR,而toDir是要放置MD5文件的目录 .
More info here.
Google guava提供了一个新的API . 找到下面的一个:
这是一个方便的变体,它使用了来自Java 9的
InputStream.transferTo()
和来自Java 11的OutputStream.nullOutputStream()
. 它不需要外部库,也不需要将整个文件加载到内存中 .和
回报