英文:
Java compare md5 with another md5 from another generator : not same value
问题
这是您要求的代码部分的翻译:
我可以使用以下函数生成MD5哈希值:
private void generateMd5() throws NoSuchAlgorithmException, IOException {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] hash = md.digest(pathFile.getBytes());
nomGestionnaire.setText(String.valueOf(String.format("%032X", new BigInteger(1, hash))));
}
我的问题是,当我将生成的MD5哈希值与另一个MD5生成器进行比较时,我得到的值不相同。
这正常吗?好像我的生成器没有生成**真正的MD5**?
使用此文件进行测试:aaa.txt(内容:aaa)
我的生成器:`A4FA953DB4BC7772E5AF67BD706B9110`
其他生成器:`47bce5c74f589f4867dbd57e9ca9f808`
编辑:
```java
FileChooser fileChooser = new FileChooser();
File selectedFile = new File(String.valueOf(fileChooser.showOpenDialog(primaryStage)));
nameFile = selectedFile.getName();
pathFile = selectedFile.getPath();
请注意,MD5哈希值的不同可能是由于文本编码或其他因素引起的。
英文:
I can generate md5 with this function :
private void generateMd5() throws NoSuchAlgorithmException, IOException {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] hash = md.digest(pathFile.getBytes());
nomGestionnaire.setText(String.valueOf(String.format("%032X", new BigInteger(1, hash))));
}
My problem is when I compare my md5 generate with another md5 generator I don't have the same value.
Is it normal ? It's like my generator doesn't generate a real md5 ?
Test with this file : aaa.txt (content : aaa)
My generator : A4FA953DB4BC7772E5AF67BD706B9110
other generator : 47bce5c74f589f4867dbd57e9ca9f808
EDIT :
FileChooser fileChooser = new FileChooser();
File selectedFile = new
File(String.valueOf(fileChooser.showOpenDialog(primaryStage)));
nameFile = selectedFile.getName();
pathFile = selectedFile.getPath();
答案1
得分: 2
以下是您要翻译的内容:
我猜输入中有一些错误。不幸的是,您提供的文件不完整。因此,我首先编写了一个执行基本MD5的Java方法。然后,我进行了一些取证工作,猜测并修复了代码。两者都生成了正确的MD5值:47BCE5C74F589F4867DBD57E9CA9F808
public static String getMD5(String filename)
throws NoSuchAlgorithmException, IOException {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(Files.readAllBytes(Paths.get(filename)));
byte[] digest = md.digest();
String myChecksum = DatatypeConverter.printHexBinary(digest).toUpperCase();
return myChecksum;
}
public static String generateMd5(String pathToFile) throws NoSuchAlgorithmException, IOException {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] hash = md.digest(Files.readAllBytes(Paths.get(pathToFile)));
return String.valueOf(String.format("%032X", new BigInteger(1, hash)));
}
英文:
I guess there's some error on the input. Unfortunately the and file you provided is not complete. So I did I first wrote a Java method that does a basic md5. Then I did some forensics to guess and fix the code. Both deliver correct MD5: 47BCE5C74F589F4867DBD57E9CA9F808
public static String getMD5(String filename)
throws NoSuchAlgorithmException, IOException {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(Files.readAllBytes(Paths.get(filename)));
byte[] digest = md.digest();
String myChecksum = DatatypeConverter.printHexBinary(digest).toUpperCase();
return myChecksum;
}
public static String generateMd5(String pathToFile) throws NoSuchAlgorithmException, IOException {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] hash = md.digest(Files.readAllBytes(Paths.get(pathToFile)));
return String.valueOf(String.format("%032X", new BigInteger(1, hash)));
}
答案2
得分: 0
我以前遇到过这个问题,这可能是一个编码问题(来自文件路径)。
我在我的项目中这样放置它,从那以后它就一直工作得很好。
我会为您提供一个示例,所以您可能会从中得到一个思路:
public String hash(String stringToHash){
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
// 在这里,您使用所需的算法初始化了消息摘要单例
messageDigest.update(stringToHash.getBytes());
// 现在,您使用字符串的字节更新了它
byte[] digest = messageDigest.digest();
String result = DatatypeConverter.printHexBinary(digest);
// 最后,您将结果(十六进制)转换为字符串(您的散列字符串)
// 您可能希望使用toLowerCase()以使其不区分大小写
return result;
}
注意:您可以使用多种方法来使用MD5进行哈希,我更喜欢使用Apache Commons作为一种简单的方法,您可能想要查看这个 使用Apache Commons进行MD5哈希。
您还可以使用Google Guava来做到这一点:使用Google Guava进行MD5哈希。
英文:
I faced this problem before, it is probably an encoding problem (from that file path).
I put it like this in my project, and it's working just fine since then.
I'll provide you with a sample, so probably you get an idea from this:
public String hash(String stringToHash){
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
// here you init the message digit singleton with the wanted algorithm
messageDigest.update(stringToHash.getBytes());
//now you updated it, with the bytes of your string
byte[] digest = messageDigest.digest();
String result = DatatypeConverter.printHexBinary(digest);
// finally you converted the result (hex) to String (you hashed string)
// you may want to use toLowerCase() so you make it case insensitive
return result;
}
NOTE: you have many way to hash using md5, I really prefer using the Apache Commons as an easy way, you may want to check this out MD5 Hashing using Apache Commons.
You also can do that using Google Guava : MD5 Hashing using Google Guava.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论