2009-04-17 9 views
5

Biorę mieszanie MD5 pliku obrazu i chcę użyć skrótu jako nazwy pliku.Jak przekonwertować skrót mieszania MD5 na ciąg znaków i użyć go jako nazwy pliku

Jak przekonwertować skrót na ciąg, który jest prawidłową nazwą pliku?

Edycja: toString() tylko daje "System.Byte []"

+0

Chcesz uzyskać hash jako hex nie binarny ... Nie rób C# chociaż tak nie wiem jak – Greg

+0

Podobnie jak głowy do góry, może chcesz używać SHAX od MD5 jest bycie wycofano. –

+1

Jedynym powodem, dla którego należy przerwać używanie MD5, jest atak kryptograficzny na niego ostatnio (to samo dotyczy SHA-0/1). Jeśli nie używasz go z powodów kryptograficznych, nie ma większego pośpiechu, aby się zmienić. –

Odpowiedz

10

System.Convert.ToBase64String

Jako commenter wskazał - normalne kodowanie podstawa 64 może zawierać znak '/', który obivously będzie problemu z nazwami plików. Istnieją jednak inne znaki, które są użyteczne, takie jak podkreślenie - po prostu zamień wszystkie "/" na podkreślenie.

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

Jestem gettig błąd przy użyciu tego i jeśli spróbuj z powiedz test.jpg działa? – Malcolm

+0

Patrząc na to jest "/" w ciągu znaków i błąd nie może znaleźć części ścieżki pf ?? – Malcolm

+0

Usuń wszystkie znaki "/" lub użyj podejścia, które sugeruję w mojej odpowiedzi. – sharptooth

20

Jak o tym:

string filename = BitConverter.ToString(yourMD5ByteArray); 

Jeśli wolisz krótszą nazwę pliku bez myślników następnie można po prostu użyć:

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

Ok, nie wiedziałem o tej klasie, i robi to podstępem. –

+0

Uwaga ta wykorzystuje kodowanie szesnastkowe. – meandmycode

1

Technicznie za pomocą Base64 jest źle, jeśli to jest Windows, nazw nie są rozróżniane wielkości liter (przynajmniej w widoku odkrywców) .. ale w base64, "a" różni się od "A", oznacza to, że być może jest to mało prawdopodobne, ale kończy się jeszcze większym stopniem kolizji ..

Lepszą alternatywą jest szesnastkowa jak klasa bitconverter, lub jeśli możesz - użyj kodowania base32 (które po usunięciu wypełnienia z base64 i base32, a w przypadku 128-bitowego, da ci nazwy plików o podobnych długościach).

3

Spróbuj tego:

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() używa NIE kolejnej kolejności początkowej tablicy bajtów! – springy76

3

Jest to prawdopodobnie najbezpieczniejsza dla nazw plików. Zawsze uzyskać ciąg szesnastkowy i nigdy martwić/lub +, itp

 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

Spróbuj tego:

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

lub

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

Należy zauważyć, że w Base64 są używane nazwy zawierające duże i małe litery. W systemach plików Windows nie jest rozróżniana wielkość liter, więc należy zachować ostrożność. – nzeemin

1

Spróbuj Base32 hash MD5. Zapewnia łańcuchy nazw zależne od wielkości liter.

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

Należy pamiętać, że MD5 nie jest zgodny z FIPS i spowoduje zgłoszenie wyjątku na komputerach z włączoną obsługą FIPS. Zamiast tego użyj SHA1. –

Powiązane problemy