Пример #1
0
        byte[] CalculateHash(Stream stream, bool create)
        {
            long pos = stream.Position;

            if (create)
            {
                _bodyLength = StreamLength(stream);
            }

            using (HashAlgorithm hasher = (_snk != null) ? _snk.CreateHasher() : QQnCryptoHelpers.CreateHashAlgorithm(_hashType))
            {
                long newPos = _hashPosition;

                if (stream.Position != newPos)
                {
                    stream.Position = newPos;
                }

                byte[] buffer;

                using (MemoryStream ms = new MemoryStream())                 // Use memorystream and writer to resolve endian-issues
                    using (QQnBinaryWriter bw = new QQnBinaryWriter(ms))
                    {
                        bw.Write(_guid.ToByteArray());
                        bw.Write(_bodyLength);

                        buffer = ms.ToArray();
                    }

                hasher.TransformBlock(buffer, 0, buffer.Length, null, 0);

                buffer = new byte[8192];

                int nRead;

                while (0 != (nRead = stream.Read(buffer, 0, buffer.Length)))
                {
                    hasher.TransformBlock(buffer, 0, nRead, null, 0);
                }

                hasher.TransformFinalBlock(buffer, 0, 0);

                if (stream.CanSeek)
                {
                    stream.Position = pos;
                }

                return(hasher.Hash);
            }
        }