2011-10-15 40 views
9

Trong http://www.anyexample.com/programming/java/java_simple_class_to_compute_md5_hash.xml một ví dụ được đưa ra cách tính giá trị băm MD5 của chuỗi. Điều này dẫn đến một chuỗi chữ số gồm 20 chữ số. Theo http://en.wikipedia.org/wiki/MD5 tôi mong đợi một chuỗi hex 32 chữ số. Tôi nhận được kết quả tương tự cho ví dụ sử dụng phản hồi dac2009 trong How can I generate an MD5 hash?.Java tính toán MD5 băm

Tại sao tôi nhận được thứ gì đó giống như băm MD5 nhưng không? Tôi không thể tưởng tượng rằng tất cả các chuỗi tôi nhận được tôi phải pad với 12 số không hàng đầu.

Edit: một mã ví dụ

public static String MungPass(String pass) throws NoSuchAlgorithmException { 
    MessageDigest m = MessageDigest.getInstance("MD5"); 
    byte[] data = pass.getBytes(); 
    m.update(data,0,data.length); 
    BigInteger i = new BigInteger(1,m.digest()); 
    return String.format("%1$032X", i); 
} 

Taken từ http://snippets.dzone.com/posts/show/3686

+0

Liên kết đầu tiên của bạn là 404 – Paul

+2

Vui lòng đăng một ví dụ ngắn (đầy đủ) mã chứng minh sự cố bạn đang gặp phải. Nếu không có điều đó, chúng tôi không thể cho bạn biết những gì bạn đang làm sai :) Phương pháp được mô tả trong câu hỏi StackOverflow bạn liên kết đến là cách bạn tạo một băm MD5 thực sự là 32 ký tự hex –

+0

Liên kết đầu tiên hoạt động ở đây ... – AndyAndroid

Trả lời

3

Mã ví dụ bạn đã liên kết, có trong mã ý kiến ​​xấu của tôi . Có vẻ như các autor không biết làm thế nào một máy tính hoạt động. Tuy nhiên, có nhiều ví dụ tốt hơn.

Ví dụ cuối cùng là một trong những bạn đang tìm kiếm. Chech Ideone này: http://ideone.com/ZeN8a


Update 0: Tôi chưa bao giờ thấy trước đây theo cách này của định dạng một String ("%1$032X"), vì vậy tôi không biết những gì nó làm. Bạn cần 128 bit để biểu diễn hàm băm MD5 và tôi sẽ đề nghị sử dụng phương thức toString(16) của BigInteger để tạo ra một biểu diễn String của BigInteger thay vì sử dụng định dạng đó.

String hashtext = bigInt.toString(16); 

Cập nhật 1: Tôi thực sự không biết nữa có gì sai với mã được cung cấp. Hãy thử điều này:

System.out.println(MungPass("java")); 

Và nếu vẫn tạo ra 20 chữ số, hãy thử cài đặt lại Java. Tôi hết cảm hứng.

+0

Tôi đã làm những gì được đưa ra trong liên kết đầu tiên -> 20 ký tự, tôi đã xem liên kết thứ hai -> nhận xét cho bài đăng đó: nó bỏ qua khoảng trắng ở cuối. Vì vậy, không có phương pháp nào hoạt động tốt. bạn đã thành công khi chạy chúng? – AndyAndroid

+0

okay Tôi đã thay đổi câu lệnh return của mình thành "return i.toString (16);". Tôi vẫn nhận được kết quả tương tự. 20 chữ số. Bạn đã chạy mã và nhận được 32 chữ số? – AndyAndroid

+0

cài đặt lại là không thể, nó chạy trên một điện thoại Android, nhưng bạn là đúng tôi đã cố gắng trong một cài đặt java máy tính để bàn đồng bằng, có nó là 32 chữ số. Có thể một lỗi trong Android. Cảm ơn tất cả sự giúp đỡ của bạn. – AndyAndroid

40

sử dụng org.apache.commons.codec.digest.DigestUtils thay vì:

DigestUtils.md5Hex(str); 

này sẽ cung cấp cho bạn 32 chuỗi char kết quả là

+2

vì đây là ứng dụng dành cho thiết bị di động, tôi không muốn sử dụng bất kỳ gói bổ sung nào, thay vào đó sẽ ở lại với "java thuần". – AndyAndroid

+5

tiêu đề chủ đề là gây hiểu nhầm, bởi vì không có đề cập đến về điện thoại di động. ví dụ câu trả lời này là hữu ích và đơn giản đối với tôi, bởi vì tôi tìm kiếm một ví dụ java đơn giản. câu trả lời này là hoàn hảo cho tôi :) – sarkiroka

+1

@sarkiroka nếu tiêu đề/thẻ đã đề cập đến "di động", có thể bạn cũng chưa thử mở trang này. Nếu OP không thích câu trả lời cụ thể, anh ta có quyền làm như vậy. Không cần phải coi đó là hành vi phạm tội. :) – Sufian

1

Tôi đã thử ví dụ của bạn ở trên, MungPass ("java") và tôi nhận được một chuỗi gồm 32 chữ số, 93f725a07423fe1c889f448b33d21f46. Vì bạn có 20 cái đầu tiên trong số đó khi bạn chạy, tôi đoán bạn chỉ đơn giản là thiếu một cái gì đó trong bản in?

Các vấn đề liên quan