2009-04-17 30 views
5

Tôi đang sử dụng hàm băm MD5 của tệp hình ảnh và tôi muốn sử dụng hàm băm làm tên tệp.Làm thế nào để chuyển đổi băm MD5 thành chuỗi và sử dụng nó làm tên tệp

Làm cách nào để chuyển băm thành chuỗi có tên tệp hợp lệ?

EDIT: toString() chỉ mang đến cho "System.Byte []"

+0

Bạn muốn nhận được các hash như hex không nhị phân ... Tôi không làm C# mặc dù vậy tôi không biết làm thế nào – Greg

+0

Cũng giống như một người đứng đầu lên, bạn có thể muốn sử dụng SHAx kể từ MD5 đang được giảm dần. –

+1

Lý do duy nhất để ngừng sử dụng MD5 là do các cuộc tấn công mã hóa chống lại nó gần đây (cùng với SHA-0/1). Nếu bạn không sử dụng nó vì lý do mã hóa, không có gì phải vội vàng thay đổi. –

Trả lời

10

System.Convert.ToBase64String

Là một commenter chỉ ra - bình thường căn cứ 64 mã hóa có thể chứa một '/' nhân vật, mà obivously sẽ là một vấn đề với tên tập tin. Tuy nhiên, có các ký tự khác có thể sử dụng được, chẳng hạn như dấu gạch dưới - chỉ cần thay thế tất cả '/' bằng dấu gạch dưới.

string filename = Convert.ToBase64String(md5HashBytes).Replace("/","_"); 
+0

Tôi gettig một lỗi bằng cách sử dụng đó và nếu thử với nói test.jpg nó hoạt động ?? – Malcolm

+0

Nhìn vào nó có "/" trong chuỗi và lỗi là không thể tìm thấy một phần pf path ?? – Malcolm

+0

Xóa tất cả ký tự "/" hoặc sử dụng phương pháp tôi đề xuất trong câu trả lời của tôi. – sharptooth

20

Làm thế nào về điều này:

string filename = BitConverter.ToString(yourMD5ByteArray); 

Nếu bạn thích một tên tập tin ngắn mà không có dấu gạch nối thì bạn có thể chỉ cần sử dụng:

string filename = 
    BitConverter.ToString(yourMD5ByteArray).Replace("-", string.Empty); 
+0

Ok, không biết về lớp này, và nó thực hiện thủ thuật –

+0

Lưu ý điều này sử dụng mã hóa thập lục phân. – meandmycode

1

Về mặt kỹ thuật sử dụng Base64 là xấu nếu điều này là Windows, tên tập tin là trường hợp không nhạy cảm (ít nhất là trong các nhà thám hiểm xem) .. nhưng trong base64, 'a' khác với 'A', điều này có nghĩa là có lẽ không nhưng bạn kết thúc với tỷ lệ va chạm cao hơn ..

Một giải pháp thay thế tốt hơn là thập lục phân như lớp bitconverter, hoặc nếu bạn có thể sử dụng mã hóa base32 (sau khi loại bỏ phần đệm từ cả base64 và base32, và trong trường hợp 128bit, sẽ cung cấp cho bạn tên tệp có độ dài tương tự).

3

Hãy thử điều này:

Guid guid = new Guid(md5HashBytes); 
string hashString = guid.ToString("N"); 
// format: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 

string hashString = guid.ToString("D"); 
// format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 

string hashString = guid.ToString("B"); 
// format: {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} 

string hashString = guid.ToString("P"); 
// format: (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) 
+0

Guid.ToString() sử dụng NOT thứ tự tuần tự của mảng byte ban đầu! – springy76

3

Đây có lẽ là an toàn nhất cho tên tập tin. Bạn luôn có được một chuỗi hex và không bao giờ lo lắng về/hoặc +, vv

 byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(inputString)); 
     StringBuilder sBuilder = new StringBuilder(); 
     for (int i = 0; i < data.Length; i++) 
     { 
      sBuilder.Append(data[i].ToString("x2")); 
     } 
     string hashed = sBuilder.ToString(); 
3

Hãy thử điều này:

string Hash = Convert.ToBase64String(MD5.Create().ComputeHash(Encoding.UTF8.GetBytes("sample"))); 
//input "sample" returns = Xo/5v1W6NQgZnSLphBKb5g== 

hoặc

string Hash = BitConverter.ToString(MD5.Create().ComputeHash(Encoding.UTF8.GetBytes("sample"))); 
//input "sample" returns = 5E-8F-F9-BF-55-BA-35-08-19-9D-22-E9-84-12-9B-E6 
+0

Lưu ý rằng Base64 tạo ra các tên phân biệt chữ hoa chữ thường vì nó sử dụng cả chữ hoa và chữ thường. Hệ thống tệp của Windows không phân biệt chữ hoa chữ thường, vì vậy hãy cẩn thận với điều đó. – nzeemin

1

Hãy thử Base32 băm MD5. Nó cung cấp các chuỗi không nhạy cảm với tên tệp an toàn.

string Base32Hash(string input) 
    { 
     byte[] buf = MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(input)); 
     return String.Join("", buf.Select(b => "abcdefghijklmonpqrstuvwxyz234567"[b & 0x1F])); 
    } 
+0

Xin lưu ý rằng MD5 không tuân thủ FIPS và sẽ loại trừ ngoại lệ trên các máy có bật FIPS. Thay vào đó hãy sử dụng SHA1. –

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