private static BlobIdentifier ComputeIdentifierBasedOnBlocks(IEnumerable <BlobBlockHash> blocks) { var rollingId = new VsoHash.RollingBlobIdentifier(); // ReSharper disable once GenericEnumeratorNotDisposed IEnumerator <BlobBlockHash> enumerator = blocks.GetEnumerator(); bool isLast = !enumerator.MoveNext(); if (isLast) { throw new InvalidDataException("Blob must have at least one block."); } BlobBlockHash current = enumerator.Current; isLast = !enumerator.MoveNext(); while (!isLast) { rollingId.Update(current); current = enumerator.Current; isLast = !enumerator.MoveNext(); } return(rollingId.Finalize(current)); }
/// <inheritdoc /> public override void Initialize() { _currentOffset = 0; _rollingId = new VsoHash.RollingBlobIdentifier(); _blockHashes.Clear(); _finalized = null; }
/// <inheritdoc /> public override void Initialize() { _currentOffset = 0; _rollingId = new VsoHash.RollingBlobIdentifier(); _blockHashes.Clear(); if (_buffer == null) { // Initialize can be called more than once per instance, once during construction, and another time by HasherToken. // This is not happening concurrently, so no need for any synchronization. _bufferHandle = GlobalObjectPools.TwoMbByteArrayPool.Get(); _buffer = _bufferHandle.Value; } }
/// <inheritdoc /> protected override byte[] HashFinal() { var rollingId = new VsoHash.RollingBlobIdentifier(); // Flush out buffer if (_currentOffset != 0) { _blockHashes.Add(VsoHash.HashBlock(_buffer, _currentOffset)); } // if there are no blocks add an empty block if (_blockHashes.Count == 0) { _blockHashes.Add(VsoHash.HashBlock(new byte[] { }, 0)); } for (int i = 0; i < _blockHashes.Count - 1; i++) { rollingId.Update(_blockHashes[i]); } return(rollingId.Finalize(_blockHashes[_blockHashes.Count - 1]).Bytes); }