C# hashcode for array of ints C# hashcode for array of ints arrays arrays

C# hashcode for array of ints


Not very clever, but sufficient for most practical purposes:

EDIT: changed due to comment of Henk Holterman, thanks for that.

  int hc = array.Length;  foreach (int val in array)  {      hc = unchecked(hc * 314159 + val);  }

If you need something more sophisticated, look here.


For an array of values generally between -1000 and 1000, I would probably use something like this:

static int GetHashCode(int[] values){   int result = 0;   int shift = 0;   for (int i = 0; i < values.Length; i++)   {      shift = (shift + 11) % 21;      result ^= (values[i]+1024) << shift;   }   return result;}


You may use CRC32 checksum. Here is the code:

[CLSCompliant(false)]public class Crc32 {    uint[] table = new uint[256];    uint[] Table { get { return table; } }    public Crc32() {        MakeCrcTable();    }    void MakeCrcTable() {        for (uint n = 0; n < 256; n++) {            uint value = n;            for (int i = 0; i < 8; i++) {                if ((value & 1) != 0)                    value = 0xedb88320 ^ (value >> 1);                else                    value = value >> 1;            }            Table[n] = value;        }    }    public uint UpdateCrc(uint crc, byte[] buffer, int length) {        uint result = crc;        for (int n = 0; n < length; n++) {            result = Table[(result ^ buffer[n]) & 0xff] ^ (result >> 8);        }        return result;    }    public uint Calculate(Stream stream) {        long pos = stream.Position;        const int size = 0x32000;        byte[] buf = new byte[size];        int bytes = 0;        uint result = 0xffffffff;        do {            bytes = stream.Read(buf, 0, size);            result = UpdateCrc(result, buf, bytes);        }        while (bytes == size);        stream.Position = pos;        return ~result;    }}