diff --git a/src/addoncreator/Addon/AddonFile.cs b/src/addoncreator/Addon/AddonFile.cs index 2b63077..fc9fac5 100644 --- a/src/addoncreator/Addon/AddonFile.cs +++ b/src/addoncreator/Addon/AddonFile.cs @@ -94,7 +94,7 @@ namespace GarrysMod.AddonCreator.Addon stream.Position = 0; stream.Read(baseAddon, 0, baseAddon.Length); var baseAddonHash = sr.ReadInt32(); - var calcAddonHash = ParallelCRC.Compute(baseAddon); + var calcAddonHash = Crc32.Compute(baseAddon); Debug.WriteLine("\tCalculated hash: {0}; Wanted hash: {1}", calcAddonHash, baseAddonHash); Debug.Assert(calcAddonHash == baseAddonHash, "CRC32 hash mismatch", "Calculated CRC32 hash is different from the one saved within the addon. Causes could be a corrupted file or the edge case bug https://github.com/icedream/gmadsharp/issues/2."); @@ -189,7 +189,7 @@ namespace GarrysMod.AddonCreator.Addon } // CRC check for this file - var fileCalcHash = ParallelCRC.Compute(fileContent); + var fileCalcHash = Crc32.Compute(fileContent); Debug.WriteLine("\t\tCalculated hash: {0}; Wanted hash: {1}", fileCalcHash, fileHash); if (fileCalcHash != fileHash) { @@ -320,7 +320,7 @@ namespace GarrysMod.AddonCreator.Addon } // Addon CRC - var addonHash = ParallelCRC.Compute(stream.ToArray()); + var addonHash = Crc32.Compute(stream.ToArray()); sw.Write(addonHash); using (var outfile = File.Create(path)) diff --git a/src/addoncreator/Addon/AddonFileInfo.cs b/src/addoncreator/Addon/AddonFileInfo.cs index b354742..1354631 100644 --- a/src/addoncreator/Addon/AddonFileInfo.cs +++ b/src/addoncreator/Addon/AddonFileInfo.cs @@ -20,7 +20,7 @@ namespace GarrysMod.AddonCreator.Addon /// public virtual int Crc32Hash { - get { return _hash.HasValue ? _hash.Value : (_hash = ParallelCRC.Compute(GetContents())).Value; } + get { return _hash.HasValue ? _hash.Value : (_hash = Crc32.Compute(GetContents())).Value; } } /// diff --git a/src/addoncreator/GarrysMod.AddonCreator.csproj b/src/addoncreator/GarrysMod.AddonCreator.csproj index fd52c11..3895f1d 100644 --- a/src/addoncreator/GarrysMod.AddonCreator.csproj +++ b/src/addoncreator/GarrysMod.AddonCreator.csproj @@ -55,13 +55,11 @@ - - + - diff --git a/src/addoncreator/Hashing/ParallelCRC.cs b/src/addoncreator/Hashing/Crc32.cs similarity index 96% rename from src/addoncreator/Hashing/ParallelCRC.cs rename to src/addoncreator/Hashing/Crc32.cs index 444398d..687fbc9 100644 --- a/src/addoncreator/Hashing/ParallelCRC.cs +++ b/src/addoncreator/Hashing/Crc32.cs @@ -3,7 +3,7 @@ using System.Threading; namespace GarrysMod.AddonCreator.Hashing { - public class ParallelCRC + public class Crc32 { private const uint kCrcPoly = 0xEDB88320; private const uint kInitial = 0xFFFFFFFF; @@ -16,7 +16,7 @@ namespace GarrysMod.AddonCreator.Hashing private uint value; - static ParallelCRC() + static Crc32() { unchecked { @@ -37,7 +37,7 @@ namespace GarrysMod.AddonCreator.Hashing } } - public ParallelCRC() + public Crc32() { Init(); } @@ -150,7 +150,7 @@ namespace GarrysMod.AddonCreator.Hashing public static int Compute(byte[] data, int offset, int count) { - var crc = new ParallelCRC(); + var crc = new Crc32(); crc.Update(data, offset, count); return crc.Value; } @@ -270,13 +270,13 @@ namespace GarrysMod.AddonCreator.Hashing private class Job { - private readonly ParallelCRC accumulator; + private readonly Crc32 accumulator; private readonly Job waitForJob; private ArraySegment data; private ManualResetEventSlim finished; - public Job(ArraySegment data, ParallelCRC accumulator, Job waitForJob) + public Job(ArraySegment data, Crc32 accumulator, Job waitForJob) { this.data = data; this.accumulator = accumulator; @@ -298,7 +298,7 @@ namespace GarrysMod.AddonCreator.Hashing Dispose(); } - public void Dispose() + private void Dispose() { if (finished != null) finished.Dispose(); finished = null; diff --git a/src/addoncreator/Hashing/OptimizedCRC.cs b/src/addoncreator/Hashing/OptimizedCRC.cs deleted file mode 100644 index aff0975..0000000 --- a/src/addoncreator/Hashing/OptimizedCRC.cs +++ /dev/null @@ -1,126 +0,0 @@ -using System; - -namespace GarrysMod.AddonCreator.Hashing -{ - public class OptimizedCRC - { - private const uint kCrcPoly = 0xEDB88320; - private const uint kInitial = 0xFFFFFFFF; - private const uint CRC_NUM_TABLES = 8; - private static readonly uint[] Table; - - private uint value; - - static OptimizedCRC() - { - unchecked - { - Table = new uint[256*CRC_NUM_TABLES]; - uint i; - for (i = 0; i < 256; i++) - { - var r = i; - for (var j = 0; j < 8; j++) - r = (r >> 1) ^ (kCrcPoly & ~((r & 1) - 1)); - Table[i] = r; - } - for (; i < 256*CRC_NUM_TABLES; i++) - { - var r = Table[i - 256]; - Table[i] = Table[r & 0xFF] ^ (r >> 8); - } - } - } - - public OptimizedCRC() - { - Init(); - } - - public int Value - { - get { return (int) ~value; } - } - - /// - /// Reset CRC - /// - public void Init() - { - value = kInitial; - } - - public void UpdateByte(byte b) - { - value = (value >> 8) ^ Table[(byte) value ^ b]; - } - - public void Update(byte[] data, int offset, int count) - { - new ArraySegment(data, offset, count); // check arguments - if (count == 0) return; - - var table = Table; // important for performance! - - var crc = value; - - for (; (offset & 7) != 0 && count != 0; count--) - crc = (crc >> 8) ^ table[(byte) crc ^ data[offset++]]; - - if (count >= 8) - { - /* - * Idea from 7-zip project sources (http://7-zip.org/sdk.html) - */ - - var to = (count - 8) & ~7; - count -= to; - to += offset; - - while (offset != to) - { - crc ^= - (uint) - (data[offset] + (data[offset + 1] << 8) + (data[offset + 2] << 16) + - (data[offset + 3] << 24)); - var high = - (uint) - (data[offset + 4] + (data[offset + 5] << 8) + (data[offset + 6] << 16) + - (data[offset + 7] << 24)); - offset += 8; - - crc = table[(byte) crc + 0x700] - ^ table[(byte) (crc >>= 8) + 0x600] - ^ table[(byte) (crc >>= 8) + 0x500] - ^ table[ /*(byte)*/(crc >> 8) + 0x400] - ^ table[(byte) (high) + 0x300] - ^ table[(byte) (high >>= 8) + 0x200] - ^ table[(byte) (high >>= 8) + 0x100] - ^ table[ /*(byte)*/(high >> 8) + 0x000]; - } - } - - while (count-- != 0) - crc = (crc >> 8) ^ table[(byte) crc ^ data[offset++]]; - - value = crc; - } - - public static int Compute(byte[] data, int offset, int size) - { - var crc = new OptimizedCRC(); - crc.Update(data, offset, size); - return crc.Value; - } - - public static int Compute(byte[] data) - { - return Compute(data, 0, data.Length); - } - - public static int Compute(ArraySegment block) - { - return Compute(block.Array, block.Offset, block.Count); - } - } -} \ No newline at end of file diff --git a/src/addoncreator/Hashing/TraditionalCRC.cs b/src/addoncreator/Hashing/TraditionalCRC.cs deleted file mode 100644 index 77b7d37..0000000 --- a/src/addoncreator/Hashing/TraditionalCRC.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System; - -namespace GarrysMod.AddonCreator.Hashing -{ - public class TraditionalCRC - { - private const uint kCrcPoly = 0xEDB88320; - private const uint kInitial = 0xFFFFFFFF; - private static readonly uint[] Table; - - private uint value; - - static TraditionalCRC() - { - unchecked - { - Table = new uint[256]; - for (uint i = 0; i < 256; i++) - { - var r = i; - for (var j = 0; j < 8; j++) - r = (r >> 1) ^ (kCrcPoly & ~((r & 1) - 1)); - Table[i] = r; - } - } - } - - public TraditionalCRC() - { - Init(); - } - - public int Value - { - get { return (int) ~value; } - } - - /// - /// Reset CRC - /// - public void Init() - { - value = kInitial; - } - - public void UpdateByte(byte b) - { - value = (value >> 8) ^ Table[(byte) value ^ b]; - } - - public void Update(byte[] data, int offset, int count) - { - if (count < 0) throw new ArgumentOutOfRangeException("count"); - while (count-- != 0) - value = (value >> 8) ^ Table[(byte) value ^ data[offset++]]; - } - - public static int Compute(byte[] data, int offset, int count) - { - var crc = new TraditionalCRC(); - crc.Update(data, offset, count); - return crc.Value; - } - - public static int Compute(byte[] data) - { - return Compute(data, 0, data.Length); - } - - public static int Compute(ArraySegment block) - { - return Compute(block.Array, block.Offset, block.Count); - } - } -} \ No newline at end of file