Saya menggunakan kode C # berikut untuk menghitung hash MD5 dari sebuah string. Ini bekerja dengan baik dan menghasilkan string hex 32-karakter seperti ini:
900150983cd24fb0d6963f7d28e17f72
string sSourceData;
byte[] tmpSource;
byte[] tmpHash;
sSourceData = "MySourceData";
//Create a byte array from source data.
tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData);
tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);
// and then convert tmpHash to string...
Apakah ada cara untuk menggunakan kode seperti ini untuk menghasilkan string hex 16-karakter (atau string 12-karakter)? String hex 32-karakter bagus tapi saya pikir itu akan membosankan bagi pelanggan untuk memasukkan kode!
Jawaban:
Sesuai MSDN
Buat MD5:
sumber
sumber
BitConverter
tidak bekerja dengan cara yang sama di windows dan linux, lihat pertanyaan ini: stackoverflow.com/questions/11454004/…Sedang mencoba untuk membuat representasi string hash MD5 menggunakan LINQ, namun, tidak ada jawaban yang solusi LINQ, oleh karena itu menambahkan ini ke hamparan solusi yang tersedia.
sumber
return string.Join( "", hash.ComputeHash( Encoding.UTF8.GetBytes(observedText) ).Select( x => x.ToString("x2") ) );
return string.Concat( hash.ComputeHash( Encoding.UTF8.GetBytes(observedText) ).Select( x => x.ToString("x2") ) );
sebagai gantinya. Ini sedikit lebih pendek, mungkin niat lebih jelas, dan berkinerja sedikit lebih cepat (<10% perf. Meningkat).Tergantung sepenuhnya pada apa yang ingin Anda capai. Secara teknis, Anda bisa mengambil 12 karakter pertama dari hasil hash MD5, tetapi spesifikasi MD5 adalah untuk menghasilkan karakter 32 karakter.
Mengurangi ukuran hash mengurangi keamanan, dan meningkatkan kemungkinan tabrakan dan sistem menjadi rusak.
Mungkin jika Anda memberi tahu kami lebih banyak tentang apa yang ingin Anda capai, kami mungkin dapat membantu lebih banyak.
sumber
Anda dapat menggunakan
Convert.ToBase64String
untuk mengonversi 16 byte output MD5 ke string ~ 24 char. Sedikit lebih baik tanpa mengurangi keamanan. (j9JIbSY8HuT89/pwdC8jlw==
sebagai contoh)sumber
Mendukung aliran string dan file.
contoh
-
sumber
Saya kira lebih baik menggunakan pengkodean UTF-8 dalam string MD5.
sumber
Hash MD5 adalah 128 bit, jadi Anda tidak dapat merepresentasikannya dalam hex dengan kurang dari 32 karakter ...
sumber
sumber
Alternatif jawaban yang ada untuk .NET Core 2.1 dan yang lebih cepat:
Anda dapat mengoptimalkannya lebih banyak lagi jika Anda yakin bahwa string Anda cukup kecil dan ganti pengodean. DapatkanBytes dengan intro GetBytes (ReadOnlySpan chars, Span byte) alternatif yang tidak aman.
sumber
Solusi ini membutuhkan c # 8 dan memanfaatkan
Span<T>
. Catatan, Anda masih perlu menelepon.Replace("-", string.Empty).ToLowerInvariant()
untuk memformat hasilnya jika perlu.sumber
sumber
https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.md5?view=netframework-4.7.2
sumber
Saya ingin menawarkan alternatif yang tampaknya berkinerja setidaknya 10% lebih cepat daripada jawaban craigdfrench dalam pengujian saya (.NET 4.7.2):
Jika Anda lebih suka memiliki
using System.Runtime.Remoting.Metadata.W3cXsd2001;
di atas, badan metode dapat dibuat lebih mudah dibaca satu-liner:Cukup jelas, tetapi untuk kelengkapan, dalam konteks OP itu akan digunakan sebagai:
sumber
Idk apa saja tentang string hex 16 karakter ....
Tapi ini milik saya untuk membuat hash MD5 dalam satu baris.
sumber