赞
踩
最近.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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。