Beispiel #1
0
        public unsafe void Hash128PtrOverloads()
        {
            ulong  seed1      = 238929482;
            ulong  seed2      = 19384920392;
            string testString = "This is a test string";
            ulong  hash1      = seed1;
            ulong  hash2      = seed2;

            fixed(void *ptr = testString)
            {
                int len = testString.Length * 2;

                SpookyHash.Hash128(ptr, len, ref hash1, ref hash2);
                HashCode128 hc = new HashCode128(hash1, hash2);

                Assert.Equal(hc, SpookyHash.Hash128((UIntPtr)ptr, len, seed1, seed2));
                Assert.Equal(hc, SpookyHash.Hash128((UIntPtr)ptr, len, (long)seed1, (long)seed2));
                Assert.Equal(hc, SpookyHash.Hash128((IntPtr)ptr, len, seed1, seed2));
                Assert.Equal(hc, SpookyHash.Hash128((IntPtr)ptr, len, (long)seed1, (long)seed2));
            }

            SpookyHash.Hash128(default(void *), 50, ref hash1, ref hash2);
            Assert.Equal(0UL, hash1);
            Assert.Equal(0UL, hash2);
            Assert.Equal(HashCode128.Zero, SpookyHash.Hash128(UIntPtr.Zero, 50, seed1, seed2));
            Assert.Equal(HashCode128.Zero, SpookyHash.Hash128(UIntPtr.Zero, 50, (long)seed1, (long)seed2));
            Assert.Equal(HashCode128.Zero, SpookyHash.Hash128(IntPtr.Zero, 50, seed1, seed2));
            Assert.Equal(HashCode128.Zero, SpookyHash.Hash128(IntPtr.Zero, 50, (long)seed1, (long)seed2));
        }
Beispiel #2
0
        private static void ParseStorageFile(StorageMetadata metadata, Stream storageStream, ulong?profileKey = null)
        {
            byte[] data = null;
            using (BinaryReader reader = new BinaryReader(storageStream))
            {
                data = reader.ReadBytes((int)reader.BaseStream.Length);
            }

            var rawSha256 = new SHA256Managed().ComputeHash(data);
            var sha256    = BitConverter.ToString(rawSha256).Replace("-", "");

            if (sha256 != metadata.SHA256)
            {
                throw new InvalidDataException("Invalid storage file. Corrupt or wrong file?");
            }

            if (metadata.StorageVersion == STORAGE_VERSION_V1)
            {
                var key           = GenerateKey(metadata, profileKey);
                var decryptedData = XXTEA.Decrypt(data, key);
                var output        = Decompress(metadata, decryptedData);

                // Verify data
                SpookyHash sh = new SpookyHash(0x155af93ac304200, 0x8ac7230489e7ffff);
                sh.Update(new SHA256Managed().ComputeHash(output));
                sh.Update(output);

                ulong hash1, hash2;
                sh.Final(out hash1, out hash2);

                ulong orig_hash1 = metadata.Key[0];
                ulong orig_hash2 = metadata.Key[1];

                if (orig_hash1 != hash1 || orig_hash2 != hash2)
                {
                    throw new InvalidDataException("Invalid decrypted data. Wrong key?");
                }

                metadata.StorageRaw = output;
            }
            else
            {
                SpookyHash sh = new SpookyHash(0x155af93ac304200, 0x8ac7230489e7ffff);
                sh.Update(rawSha256);
                sh.Update(data);

                ulong hash1, hash2;
                sh.Final(out hash1, out hash2);

                ulong orig_hash1 = metadata.Key[0];
                ulong orig_hash2 = metadata.Key[1];

                if (orig_hash1 != hash1 || orig_hash2 != hash2)
                {
                    throw new InvalidDataException("Invalid decrypted data. Wrong key?");
                }

                metadata.StorageRaw = data;
            }
        }
Beispiel #3
0
        public void FrameProtocol_RoundTripOfMultiFrames_Success()
        {
            // Arrange
            GetChunkedFileRequestMessage request = CreateGetChunkedFileRequestMessage();

            // Act
            // Build a request stream from a message frame and a chunk frame
            var   builder = new FrameProtocolBuilder();
            IBlob blob1   = new MemoryBlob(Encoding.UTF8.GetBytes("Blob1"));
            IBlob blob2   = new MemoryBlob(Encoding.UTF8.GetBytes("Blob2"));

            builder.AddFrame(request);
            builder.AddFrame(blob1);
            builder.AddFrame(blob2);
            var inputStream = builder.CreateStream();

            // Parse the request stream into multiple WopiFrame
            List <Frame> frameList = FrameProtocolParser.ParseStream(inputStream);

            // Assert
            Assert.AreEqual(3, frameList.Count);
            Assert.IsNotNull(frameList[0].Payload);
            Assert.IsNull(frameList[0].ExtendedHeader);
            Assert.IsNotNull(frameList[1].Payload);
            Assert.IsNotNull(frameList[1].ExtendedHeader);
            Assert.AreEqual(blob1.BlobId, System.Convert.ToBase64String(frameList[1].ExtendedHeader));
            var spookyHash = new SpookyHash();

            Assert.AreEqual(blob1.BlobId, spookyHash.CalculateHash(frameList[1].Payload));
            Assert.IsNotNull(frameList[2].Payload);
            Assert.IsNotNull(frameList[2].ExtendedHeader);
            Assert.AreEqual(blob2.BlobId, System.Convert.ToBase64String(frameList[2].ExtendedHeader));
            Assert.AreEqual(blob2.BlobId, spookyHash.CalculateHash(new MemoryStream(frameList[2].Payload)));
        }
Beispiel #4
0
        public void SequenceOfStrings()
        {
            SpookyHash sh = new SpookyHash();

            sh.Update(MediumLengthSequence());
            Assert.Equal(MediumLengthString.SpookyHash128(), sh.Final());
        }
Beispiel #5
0
        public static StorageMetadata CreateStorageFile(Stream dataStream, uint archiveNumber, ulong?profileKey)
        {
            StorageMetadata metadata = new StorageMetadata();

            metadata.ArchiveNumber = archiveNumber + 2;

            byte[] data = null;
            using (BinaryReader reader = new BinaryReader(dataStream))
            {
                data = reader.ReadBytes((int)reader.BaseStream.Length);
            }

            Array.Resize(ref data, data.Length + 1); // 1 byte null padding

            // Generate Spooky hash of data for later
            SpookyHash sh = new SpookyHash(0x155af93ac304200, 0x8ac7230489e7ffff);

            sh.Update(new SHA256Managed().ComputeHash(data));
            sh.Update(data);
            sh.Final(out metadata.Key[0], out metadata.Key[1]);

            var compressedData = Compress(data);
            var key            = GenerateKey(metadata, profileKey, true);

            metadata.StorageRaw       = XXTEA.Encrypt(compressedData, key);
            metadata.CompressedSize   = (uint)compressedData.Length;
            metadata.DecompressedSize = (uint)data.Length;

            return(metadata);
        }
 public HashedStream(Stream stream, ulong readSeed0, ulong readSeed1, ulong writeSeed0, ulong writeSeed1)
 {
     ExceptionHelper.CheckNotNull(stream);
     _backing = stream;
     _read    = new SpookyHash(readSeed0, readSeed1);
     _written = new SpookyHash(writeSeed0, writeSeed1);
 }
 /// <summary>Initialises a new instance of the <see cref="SpookilySharp.HashedStream"/> class with a default
 /// seed.</summary>
 /// <param name="stream">The stream to read.</param>
 public HashedStream(Stream stream)
 {
     ExceptionHelper.CheckNotNull(stream);
     _backing = stream;
     _read    = new SpookyHash();
     _written = new SpookyHash();
 }
Beispiel #8
0
        public void ConstructorsEquivalent()
        {
            ulong      ui1       = 0xdeadcafe;
            ulong      ui2       = 0xbaceba11;
            SpookyHash fromU     = new SpookyHash(ui1, ui2);
            SpookyHash fromZeroU = new SpookyHash();

            fromZeroU.Init(ui1, ui2);
            long       l1        = unchecked ((long)ui1);
            long       l2        = unchecked ((long)ui2);
            SpookyHash fromL     = new SpookyHash(l1, l2);
            SpookyHash fromZeroL = new SpookyHash();

            fromZeroL.Init(l1, l2);
            fromU.Update(MediumLengthString);
            fromZeroU.Update(MediumLengthString);
            fromL.Update(MediumLengthString);
            fromZeroL.Update(MediumLengthString);
            HashCode128 hash = fromU.Final();

            Assert.Equal(hash, fromZeroU.Final());
            Assert.Equal(hash, fromL.Final());
            Assert.Equal(hash, fromZeroL.Final());
            Assert.Equal(hash.ToString(), fromZeroL.Final().ToString());
        }
Beispiel #9
0
        public void FullFileChunkProcessor_StreamToBlobs_SucceedOnNonEmptyStream()
        {
            // Arrange
            string alreadyExistingContent = "SomeRandomText";

            byte[] bytes = Encoding.UTF8.GetBytes(alreadyExistingContent);

            SpookyHash spookyHash = new SpookyHash();
            string     hashString = spookyHash.CalculateHash(bytes);

            using (MemoryStream ms = new MemoryStream(bytes))
            {
                string[] blobIds;
                IReadOnlyDictionary <string, IBlob> blobs = new Dictionary <string, IBlob>();
                IChunkProcessor chunkProcessor            = CreateFullFileChunkProcessor();
                IBlobAllocator  allocator = CreateBlobAllocator();

                // Act
                chunkProcessor.StreamToBlobs(ms, allocator, out blobIds, out blobs);

                // Assert
                Assert.AreEqual(1, blobIds.Length);
                Assert.AreEqual(1, blobs.Count);
                Assert.AreEqual((ulong)bytes.Length, blobs[blobIds[0]].Length);
                Assert.AreEqual(hashString, blobs[blobIds[0]].BlobId);
            }
        }
Beispiel #10
0
        private static unsafe HashCode128 SpookyHash128Unchecked(string message, int startIndex, int length, ulong seed0, ulong seed1)
        {
            fixed(char *ptr = message)
            {
                SpookyHash.Hash128(ptr + startIndex, length << 1, ref seed0, ref seed1);
            }

            return(new HashCode128(seed0, seed1));
        }
Beispiel #11
0
        public void StringExtension()
        {
            string testString;

            using (Stream stm = GetStream())
                using (StreamReader tr = new StreamReader(stm))
                {
                    testString = tr.ReadToEnd();
                }
            SpookyHash sh = new SpookyHash();

            sh.Update(testString);
            HashCode128 h   = sh.Final();
            int         len = testString.Length;

            Assert.Equal(h, testString.SpookyHash128());
            Assert.Equal(h, testString.SpookyHash128(0, len, 0xDEADBEEFDEADBEEF, 0xDEADBEEFDEADBEEF));
            Assert.Equal(
                h,
                unchecked (testString.SpookyHash128(0, len, (long)0xDEADBEEFDEADBEEF, (long)0xDEADBEEFDEADBEEF)));
            Assert.Equal(h, testString.SpookyHash128(0, len));
            HashCode128 hashSlice = testString.SpookyHash128(50, 100, 0xDEADBEEFDEADBEEF, 0xDEADBEEFDEADBEEF);

            Assert.NotEqual(h, hashSlice);
            Assert.Equal(
                hashSlice,
                unchecked (testString.SpookyHash128(50, 100, (long)0xDEADBEEFDEADBEEF, (long)0xDEADBEEFDEADBEEF)));
            long longHash = testString.SpookyHash64(0, len, unchecked ((long)0xDEADBEEFDEADBEEF));

            Assert.Equal(longHash, testString.SpookyHash64(unchecked ((long)0xDEADBEEFDEADBEEF)));
            Assert.Equal(longHash, testString.SpookyHash64(0, len));
            Assert.Equal(longHash, testString.SpookyHash64());
            int hash = testString.SpookyHash32(0, len, unchecked ((int)0xDEADBEEF));

            Assert.Equal(hash, testString.SpookyHash32(unchecked ((int)0xDEADBEEF)));
            Assert.Equal(hash, testString.SpookyHash32(0, len));
            Assert.Equal(hash, testString.SpookyHash32());
            Assert.Equal(HashCode128.Zero, default(string).SpookyHash128());
            Assert.Equal(
                HashCode128.Zero,
                default(string).SpookyHash128(0, 200, 0xDEADBEEFDEADBEEF, 0xDEADBEEFDEADBEEF));
            Assert.Equal(
                HashCode128.Zero,
                unchecked (default(string).SpookyHash128(0, 200, (long)0xDEADBEEFDEADBEEF, (long)0xDEADBEEFDEADBEEF)));
            Assert.Equal(HashCode128.Zero, default(string).SpookyHash128(0, 200));
            Assert.Equal(
                HashCode128.Zero,
                default(string).SpookyHash128(50, 100, 0xDEADBEEFDEADBEEF, 0xDEADBEEFDEADBEEF));
            Assert.Equal(0, default(string).SpookyHash64(0, 200, unchecked ((long)0xDEADBEEFDEADBEEF)));
            Assert.Equal(0, default(string).SpookyHash64(unchecked ((long)0xDEADBEEFDEADBEEF)));
            Assert.Equal(0, default(string).SpookyHash64(0, 200));
            Assert.Equal(0, default(string).SpookyHash64());
            Assert.Equal(0, default(string).SpookyHash32(0, 200, unchecked ((int)0xDEADBEEF)));
            Assert.Equal(0, default(string).SpookyHash32(unchecked ((int)0xDEADBEEF)));
            Assert.Equal(0, default(string).SpookyHash32(0, 200));
            Assert.Equal(0, default(string).SpookyHash32());
        }
Beispiel #12
0
        public void CreateBlobWithInputBytes()
        {
            byte[]     bytes      = { 0, 1, 2, 3, 4 };
            SpookyHash spookyHash = new SpookyHash();

            BlobAllocator allocator = new BlobAllocator();
            IBlob         blob      = allocator.CreateBlob(bytes);

            Assert.AreEqual((ulong)5, blob.Length);
            Assert.AreEqual(spookyHash.CalculateHash(bytes), blob.BlobId);
        }
Beispiel #13
0
        public unsafe void TestPieces()
        {
            byte[] bufArr = new byte[BufferSize];
            for (int i = 0; i < BufferSize; ++i)
            {
                bufArr[i] = unchecked ((byte)i);
            }
            for (int i = 0; i < BufferSize; ++i)
            {
                ulong      a, b, c, d, seed1 = 1, seed2 = 2;
                SpookyHash state = new SpookyHash();

                // all as one call
                a = seed1;
                b = seed2;
                fixed(byte *buf = bufArr)
                {
                    SpookyHash.Hash128(buf, i, ref a, ref b);
                }

                // all as one piece
                c = 0xdeadbeefdeadbeef;
                d = 0xbaceba11baceba11;
                state.Init(seed1, seed2);
                fixed(byte *buf = bufArr)
                {
                    state.Update(buf, i);
                }

                state.Final(out c, out d);

                Assert.Equal(a, c);
                Assert.Equal(b, d);

                for (int j = 0; j < i; ++j)
                {
                    c = seed1;
                    d = seed2;
                    state.Init(c, d);
                    fixed(byte *buf = bufArr)
                    {
                        state.Update(buf, j);
                        state.Update(buf + j, i - j);
                    }

                    state.Final(out c, out d);
                    Assert.Equal(a, c);
                    Assert.Equal(b, d);
                }
            }
        }
Beispiel #14
0
        public void CreateBlobWithInputSubStream()
        {
            byte[]     bytes      = { 0, 1, 2, 3, 4 };
            SpookyHash spookyHash = new SpookyHash();

            using (MemoryStream ms = new MemoryStream(bytes))
            {
                BlobAllocator allocator = new BlobAllocator();
                IBlob         blob      = allocator.CreateBlob(ms, 4);

                Assert.AreEqual((ulong)4, blob.Length);
                Assert.AreEqual(spookyHash.CalculateHash(new byte[] { 0, 1, 2, 3 }), blob.BlobId);
            }
        }
Beispiel #15
0
        public void FinalsEquivalent()
        {
            SpookyHash sh = new SpookyHash();

            sh.Update("abcdefg");
            HashCode128 h128 = sh.Final();

            sh.Final(out ulong u1, out ulong u2);
            Assert.Equal(h128.UHash1, u1);
            Assert.Equal(h128.UHash2, u2);
            sh.Final(out long l1, out long l2);
            Assert.Equal(h128.Hash1, l1);
            Assert.Equal(h128.Hash2, l2);
        }
Beispiel #16
0
        public void Serialize()
        {
            SpookyHash sh = new SpookyHash();

            sh.Update(MediumLengthString);
            using (MemoryStream ms = new MemoryStream())
            {
                BinaryFormatter bf = new BinaryFormatter();
                bf.Serialize(ms, sh);
                ms.Seek(0, SeekOrigin.Begin);
                SpookyHash copy = (SpookyHash)bf.Deserialize(ms);
                Assert.Equal(sh.Final(), copy.Final());
            }
        }
Beispiel #17
0
        public static Metadata BuildMeta(string saveFile)
        {
            byte[] raw = File.ReadAllBytes(saveFile);

            var sha256     = ComputeHash(raw);
            var spookyHash = new SpookyHash(96176015842230784UL, 9999999999999999999UL);

            spookyHash.Update(sha256);
            spookyHash.Update(raw);
            spookyHash.Final(out ulong hash0, out ulong hash1);

            return(new Metadata {
                SHA256 = sha256, Hash = new ulong[] { hash0, hash1 }
            });
        }
Beispiel #18
0
 public unsafe void RehashUInt()
 {
     foreach (uint seed in RandomUints(RandomCycleCount))
     {
         foreach (uint message in RandomUints(RandomCycleCount))
         {
             uint  copy = message;
             uint *p    = &copy;
             Assert.Equal(SpookyHash.Hash32(p, 4, seed), message.Rehash(seed));
         }
     }
     foreach (uint message in RandomUints(RandomCycleCount))
     {
         uint  copy = message;
         uint *p    = &copy;
         Assert.Equal(SpookyHash.Hash32(p, 4, 0xDEADBEEF), message.Rehash());
     }
 }
Beispiel #19
0
        public void SingleEmptyFileElement()
        {
            XElement definition = new XElement("Resources",
                                               BuildFileElement(id: "ZeroByteFile", name: "ZeroByteFile.wopitest", filePath: "ZeroByteFile.wopitest")
                                               );

            IResourceManager resourceManager = new ResourceManagerFactory().GetResourceManager(definition);
            SpookyHash       spookyHash      = new SpookyHash();

            using (MemoryStream ms = new MemoryStream())
                using (StreamWriter sw = new StreamWriter(ms))
                {
                    sw.Write(String.Empty);
                    sw.Flush();
                    Assert.AreEqual(resourceManager.GetFileName("ZeroByteFile"), "ZeroByteFile.wopitest");
                    Assert.AreEqual(spookyHash.CalculateHash(resourceManager.GetContentStream("ZeroByteFile")), spookyHash.CalculateHash(ms));
                }
        }
Beispiel #20
0
        public void SingleNonEmptyFileElement()
        {
            XElement definition = new XElement("Resources",
                                               BuildFileElement(id: "WordBlankDocument", name: "WordBlankDocument.docx", filePath: "WordBlankDocument.docx")
                                               );

            IResourceManager resourceManager = new ResourceManagerFactory().GetResourceManager(definition);
            SpookyHash       spookyHash      = new SpookyHash();

            using (MemoryStream ms = new MemoryStream())
                using (StreamWriter sw = new StreamWriter(ms))
                {
                    sw.Write("WordBlankDocument" + "WordBlankDocument.docx" + "WordBlankDocument.docx");
                    sw.Flush();
                    Assert.AreEqual(resourceManager.GetFileName("WordBlankDocument"), "WordBlankDocument.docx");
                    Assert.AreEqual(spookyHash.CalculateHash(resourceManager.GetContentStream("WordBlankDocument")), spookyHash.CalculateHash(ms));
                }
        }
Beispiel #21
0
 public unsafe void RehashULong()
 {
     foreach (ulong seed in RandomUlongs(RandomCycleCount))
     {
         foreach (ulong message in RandomUlongs(RandomCycleCount))
         {
             ulong  copy = message;
             ulong *p    = &copy;
             Assert.Equal(SpookyHash.Hash64(p, 8, seed), message.Rehash(seed));
         }
     }
     foreach (ulong message in RandomUlongs(RandomCycleCount))
     {
         ulong  copy = message;
         ulong *p    = &copy;
         Assert.Equal(SpookyHash.Hash64(p, 8, 0xDEADBEEFDEADBEEF), message.Rehash());
     }
 }
Beispiel #22
0
        public void CreateMemoryBlob_Succeed()
        {
            // Arrange
            byte[] bytes  = new byte[100000];
            Random random = new Random((int)DateTime.Now.Millisecond);

            random.NextBytes(bytes);
            MemoryStream ms         = new MemoryStream(bytes);
            SpookyHash   spookyHash = new SpookyHash();

            // Act
            MemoryBlob memoryBlob = new MemoryBlob(ms);

            // Assert
            Assert.IsNotNull(memoryBlob);
            Assert.AreEqual((ulong)bytes.Length, memoryBlob.Length);
            Assert.AreEqual(spookyHash.CalculateHash(ms), memoryBlob.BlobId);
            ms.Dispose();
        }
Beispiel #23
0
        public void MemoryBlob_GetStream_Succeed()
        {
            // Arrange
            byte[] bytes  = new byte[1000];
            Random random = new Random((int)DateTime.Now.Millisecond);

            random.NextBytes(bytes);
            MemoryStream ms         = new MemoryStream(bytes);
            SpookyHash   spookyHash = new SpookyHash();

            // Act
            MemoryBlob memoryBlob = new MemoryBlob(ms);
            Stream     stream     = memoryBlob.GetStream();

            // Assert
            Assert.IsNotNull(stream);
            Assert.AreEqual(spookyHash.CalculateHash(bytes), spookyHash.CalculateHash(stream));
            stream.Dispose();
            ms.Dispose();
        }
Beispiel #24
0
        public unsafe void Hash32PtrOverloads()
        {
            uint   seed       = 238929482;
            string testString = "This is a test string";

            fixed(void *ptr = testString)
            {
                int  len = testString.Length * 2;
                uint hc  = SpookyHash.Hash32(ptr, len, seed);

                Assert.Equal(hc, SpookyHash.Hash32((UIntPtr)ptr, len, seed));
                Assert.Equal((int)hc, SpookyHash.Hash32((UIntPtr)ptr, len, (int)seed));
                Assert.Equal(hc, SpookyHash.Hash32((IntPtr)ptr, len, seed));
                Assert.Equal((int)hc, SpookyHash.Hash32((IntPtr)ptr, len, (int)seed));
            }

            Assert.Equal(0U, SpookyHash.Hash32(UIntPtr.Zero, 50, seed));
            Assert.Equal(0, SpookyHash.Hash32(UIntPtr.Zero, 50, (int)seed));
            Assert.Equal(0U, SpookyHash.Hash32(IntPtr.Zero, 50, seed));
            Assert.Equal(0, SpookyHash.Hash32(IntPtr.Zero, 50, (int)seed));
        }
Beispiel #25
0
        public unsafe void Hash64PtrOverloads()
        {
            ulong  seed       = 238929482;
            string testString = "This is a test string";

            fixed(void *ptr = testString)
            {
                int   len = testString.Length * 2;
                ulong hc  = SpookyHash.Hash64(ptr, len, seed);

                Assert.Equal(hc, SpookyHash.Hash64((UIntPtr)ptr, len, seed));
                Assert.Equal((long)hc, SpookyHash.Hash64((UIntPtr)ptr, len, (long)seed));
                Assert.Equal(hc, SpookyHash.Hash64((IntPtr)ptr, len, seed));
                Assert.Equal((long)hc, SpookyHash.Hash64((IntPtr)ptr, len, (long)seed));
            }

            Assert.Equal(0UL, SpookyHash.Hash64(UIntPtr.Zero, 50, seed));
            Assert.Equal(0L, SpookyHash.Hash64(UIntPtr.Zero, 50, (long)seed));
            Assert.Equal(0UL, SpookyHash.Hash64(IntPtr.Zero, 50, seed));
            Assert.Equal(0L, SpookyHash.Hash64(IntPtr.Zero, 50, (long)seed));
        }
Beispiel #26
0
        public static void TestHash(ref Metadata meta, string dataFile)
        {
            var data       = File.ReadAllBytes(dataFile);
            var dataSha256 = ComputeHash(data);

            if (dataSha256 == null || meta.SHA256 == null || !meta.SHA256.SequenceEqual(dataSha256))
            {
                throw new Exception("Invalid SHA256 hash. Corrupt or wrong file?");
            }

            var spookyHash2 = new SpookyHash(96176015842230784UL, 9999999999999999999UL);

            spookyHash2.Update(dataSha256);
            spookyHash2.Update(data);
            spookyHash2.Final(out ulong hash, out ulong hash2);

            if (meta.Hash[0] != hash || meta.Hash[1] != hash2)
            {
                throw new Exception("Invalid SpookyHash. Corrupt or wrong file?");
            }
        }
Beispiel #27
0
        public int GetHashCode(IList <T> list)
        {
            var hasher = new SpookyHash();//use methods with seeds if you need to prevent HashDos

            foreach (var item in list)
            {
                hasher.Update(item.GetHashCode());//or relevant feeds of item, etc.
            }
            return(hasher.Final().GetHashCode());

            /*
             * int hash = list.Any()?0:9;
             * unchecked
             * {
             *  foreach (var o in list)
             *  {
             *  int code = o.ToInt32(CultureInfo.InvariantCulture);
             *      hash *= 251; // multiply by a prime number
             *      hash += code; // add next hash code
             *  }
             * }
             * return hash;
             */
        }
Beispiel #28
0
 public unsafe void RehashLong()
 {
     foreach (long seed in RandomLongs(RandomCycleCount))
     {
         foreach (long message in RandomLongs(RandomCycleCount))
         {
             long  copy = message;
             long *p    = &copy;
             unchecked
             {
                 Assert.Equal((long)SpookyHash.Hash64(p, 8, (ulong)seed), message.Rehash(seed));
             }
         }
     }
     foreach (long message in RandomLongs(RandomCycleCount))
     {
         long  copy = message;
         long *p    = &copy;
         unchecked
         {
             Assert.Equal((long)SpookyHash.Hash64(p, 8, 0xDEADBEEFDEADBEEF), message.Rehash());
         }
     }
 }
Beispiel #29
0
 public unsafe void RehashInt()
 {
     foreach (int seed in RandomInts(RandomCycleCount))
     {
         foreach (int message in RandomInts(RandomCycleCount))
         {
             int  copy = message;
             int *p    = &copy;
             unchecked
             {
                 Assert.Equal((int)SpookyHash.Hash32(p, 4, (uint)seed), message.Rehash(seed));
             }
         }
     }
     foreach (int message in RandomInts(RandomCycleCount))
     {
         int  copy = message;
         int *p    = &copy;
         unchecked
         {
             Assert.Equal((int)SpookyHash.Hash32(p, 4, 0xDEADBEEF), message.Rehash());
         }
     }
 }
Beispiel #30
0
 private BlockHasher(SpookyHash hasher)
 {
     _hasher = hasher;
 }