Как сгенерировать хэш-значение CRC 32 за n итераций
Привет
Я хотел бы сгенерировать хэш-значение CRC 32, прочитав файл 2 МБ, и должен прочитать 512 байт и вычислить хэш для 512 байт и передать это сгенерированное хэш-значение на следующую итерацию и вычислить хэш следующего массива байтов итерации вместе с предыдущим хэшем и так далее до полного файла 2 МБ (то есть до 4096 итераций).
Следующим кодом, способным генерировать только одну итерацию хэша, не способным генерировать для нескольких итераций, передавая существующее значение хэша.
Ниже приведен мой код.
static void Main(string[] args) { var path = @"C:\Users\Desktop\RandomKeys.bin"; uint crc = 0; var filedata = File.ReadAllBytes(path); var readBuff = new uint[128]; Crc32Single crc32 = new Crc32Single(); for (int i = 0; i < 4096; i++) { Buffer.BlockCopy(filedata, (i * 512), readBuff, 0, 512); byte[] aa = crc32.ComputeHash(readBuff.SelectMany(BitConverter.GetBytes).ToArray(), 0, 512); Array.Reverse(aa); crc = BitConverter.ToUInt32(aa, 0); Console.WriteLine("\n********** : " + crc.ToString("X")); } Console.ReadLine(); } public sealed class Crc32 : HashAlgorithm { public const UInt32 DefaultPolynomial = 0xedb88320u; public const UInt32 DefaultSeed = 0xffffffffu; static UInt32[] defaultTable; public UInt32 seed; readonly UInt32[] table; UInt32 hash; public Crc32() : this(DefaultPolynomial, DefaultSeed) { } public Crc32(UInt32 polynomial, UInt32 seed) { table = InitializeTable(polynomial); this.seed = hash = seed; } public override void Initialize() { hash = seed; } protected override void HashCore(byte[] array, int ibStart, int cbSize) { hash = CalculateHash(table, hash, array, ibStart, cbSize); } protected override byte[] HashFinal() { var hashBuffer = UInt32ToBigEndianBytes(~hash); HashValue = hashBuffer; return hashBuffer; } public override int HashSize { get { return 32; } } public static UInt32 Compute(byte[] buffer) { return Compute(DefaultSeed, buffer); } public static UInt32 Compute(UInt32 seed, byte[] buffer) { return Compute(DefaultPolynomial, seed, buffer); } public static UInt32 Compute(UInt32 polynomial, UInt32 seed, byte[] buffer) { return ~CalculateHash(InitializeTable(polynomial), seed, buffer, 0, buffer.Length); } static UInt32[] InitializeTable(UInt32 polynomial) { if (polynomial == DefaultPolynomial && defaultTable != null) return defaultTable; var createTable = new UInt32[256]; for (var i = 0; i < 256; i++) { var entry = (UInt32)i; for (var j = 0; j < 8; j++) if ((entry & 1) == 1) entry = (entry >> 1) ^ polynomial; else entry = entry >> 1; createTable[i] = entry; } if (polynomial == DefaultPolynomial) defaultTable = createTable; return createTable; } static UInt32 CalculateHash(UInt32[] table, UInt32 seed, IList<byte> buffer, int start, int size) { var hash = seed; for (var i = start; i < start + size; i++) hash = (hash >> 8) ^ table[buffer[i] ^ hash & 0xff]; return hash; } static byte[] UInt32ToBigEndianBytes(UInt32 uint32) { var result = BitConverter.GetBytes(uint32); if (BitConverter.IsLittleEndian) Array.Reverse(result); return result; } }
спасибо и любая помощь может быть оценена по достоинству.
Что я уже пробовал:
Следуя ссылкам, которые я пробовал, но не получил точных хэш-вейлов
Crc32 с использованием HashAlgorithm
Исходный код Crc32. cs в C# .NET
КПР безопасности с#
КПР С#