本文主要是介绍在 Blazor WASM 中手撸一个.NET MD5类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
最近.net8 blazor auto大火, 我也玩了一下,发现ssr能用的代码 MD5 类在wasm是没法用的. 于是搜索了一下互联网,找到了一份代码,分享给大家.
我找到的帖子作者原话: 代码不是我的,但我确实稍微修改了它以使其与 System.Security.Cryptography.MD5 类更加一致。
public static class MD5
{public static byte[] ComputeHash(byte[] input){uint num = 1732584193u;uint num2 = 4023233417u;uint num3 = 2562383102u;uint num4 = 271733878u;int num5 = (56 - (input.Length + 1) % 64) % 64;byte[] array = new byte[input.Length + 1 + num5 + 8];Array.Copy(input, array, input.Length);array[input.Length] = 128;Array.Copy(BitConverter.GetBytes(input.Length * 8), 0, array, array.Length - 8, 4);for (int i = 0; i < array.Length / 64; i++){uint[] array2 = new uint[16];for (int j = 0; j < 16; j++){array2[j] = BitConverter.ToUInt32(array, i * 64 + j * 4);}uint num6 = num;uint num7 = num2;uint num8 = num3;uint num9 = num4;uint num10 = 0u;uint num11 = 0u;uint num12 = 0u;while (true){switch (num12){case 0u:case 1u:case 2u:case 3u:case 4u:case 5u:case 6u:case 7u:case 8u:case 9u:case 10u:case 11u:case 12u:case 13u:case 14u:case 15u:num10 = num7 & num8 | ~num7 & num9;num11 = num12;goto IL_0138;case 16u:case 17u:case 18u:case 19u:case 20u:case 21u:case 22u:case 23u:case 24u:case 25u:case 26u:case 27u:case 28u:case 29u:case 30u:case 31u:case 32u:case 33u:case 34u:case 35u:case 36u:case 37u:case 38u:case 39u:case 40u:case 41u:case 42u:case 43u:case 44u:case 45u:case 46u:case 47u:case 48u:case 49u:case 50u:case 51u:case 52u:case 53u:case 54u:case 55u:case 56u:case 57u:case 58u:case 59u:case 60u:case 61u:case 62u:case 63u:if (num12 >= 16 && num12 <= 31){num10 = num9 & num7 | ~num9 & num8;num11 = (5 * num12 + 1) % 16u;}else if (num12 >= 32 && num12 <= 47){num10 = num7 ^ num8 ^ num9;num11 = (3 * num12 + 5) % 16u;}else if (num12 >= 48){num10 = num8 ^ (num7 | ~num9);num11 = 7 * num12 % 16u;}goto IL_0138;}break;IL_0138:uint num13 = num9;num9 = num8;num8 = num7;num7 += leftRotate(num6 + num10 + K[num12] + array2[num11], s[num12]);num6 = num13;num12++;}num += num6;num2 += num7;num3 += num8;num4 += num9;}var hashBytes = new byte[16];BitConverter.GetBytes(num).CopyTo(hashBytes, 0);BitConverter.GetBytes(num2).CopyTo(hashBytes, 4);BitConverter.GetBytes(num3).CopyTo(hashBytes, 8);BitConverter.GetBytes(num4).CopyTo(hashBytes, 12);return hashBytes;}public static string ComputeHashString(byte[] input) => string.Join("", ComputeHash(input).Select(o => o.ToString("x2")));private static int[] s = new int[64]{7, 12, 17, 22, 7, 12, 17, 22, 7, 12,17, 22, 7, 12, 17, 22, 5, 9, 14, 20,5, 9, 14, 20, 5, 9, 14, 20, 5, 9,14, 20, 4, 11, 16, 23, 4, 11, 16, 23,4, 11, 16, 23, 4, 11, 16, 23, 6, 10,15, 21, 6, 10, 15, 21, 6, 10, 15, 21,6, 10, 15, 21};private static uint[] K = new uint[64]{3614090360u, 3905402710u, 606105819u, 3250441966u, 4118548399u, 1200080426u, 2821735955u, 4249261313u, 1770035416u, 2336552879u,4294925233u, 2304563134u, 1804603682u, 4254626195u, 2792965006u, 1236535329u, 4129170786u, 3225465664u, 643717713u, 3921069994u,3593408605u, 38016083u, 3634488961u, 3889429448u, 568446438u, 3275163606u, 4107603335u, 1163531501u, 2850285829u, 4243563512u,1735328473u, 2368359562u, 4294588738u, 2272392833u, 1839030562u, 4259657740u, 2763975236u, 1272893353u, 4139469664u, 3200236656u,681279174u, 3936430074u, 3572445317u, 76029189u, 3654602809u, 3873151461u, 530742520u, 3299628645u, 4096336452u, 1126891415u,2878612391u, 4237533241u, 1700485571u, 2399980690u, 4293915773u, 2240044497u, 1873313359u, 4264355552u, 2734768916u, 1309151649u,4149444226u, 3174756917u, 718787259u, 3951481745u};private static uint leftRotate(uint x, int c){return x << c | x >> 32 - c;}
}
不得不说,真香.
参考来源
https://stackoverflow.com/questions/76728300/any-net-md5-library-nuget-for-blazor-webassembly
这篇关于在 Blazor WASM 中手撸一个.NET MD5类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!