Remove unused CRC32 implementations and rename ParallelCRC to Crc32.
parent
e0a64208b2
commit
fb68de711b
|
@ -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))
|
||||
|
|
|
@ -20,7 +20,7 @@ namespace GarrysMod.AddonCreator.Addon
|
|||
/// </summary>
|
||||
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; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -55,13 +55,11 @@
|
|||
<Compile Include="Addon\AddonWhitelist.cs" />
|
||||
<Compile Include="Extensions.cs" />
|
||||
<Compile Include="Addon\JsonAddonFileInfo.cs" />
|
||||
<Compile Include="Hashing\OptimizedCRC.cs" />
|
||||
<Compile Include="Hashing\ParallelCRC.cs" />
|
||||
<Compile Include="Hashing\Crc32.cs" />
|
||||
<Compile Include="Addon\PhysicalAddonFileInfo.cs" />
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Addon\SegmentedAddonFileInfo.cs" />
|
||||
<Compile Include="Hashing\TraditionalCRC.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="packages.config" />
|
||||
|
|
|
@ -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<byte> data;
|
||||
|
||||
private ManualResetEventSlim finished;
|
||||
|
||||
public Job(ArraySegment<byte> data, ParallelCRC accumulator, Job waitForJob)
|
||||
public Job(ArraySegment<byte> 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;
|
|
@ -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; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Reset CRC
|
||||
/// </summary>
|
||||
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<byte>(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<byte> block)
|
||||
{
|
||||
return Compute(block.Array, block.Offset, block.Count);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Reset CRC
|
||||
/// </summary>
|
||||
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<byte> block)
|
||||
{
|
||||
return Compute(block.Array, block.Offset, block.Count);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue