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); } }