示例#1
0
        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));
        }
示例#2
0
 /// <inheritdoc />
 public override void Initialize()
 {
     _currentOffset = 0;
     _rollingId     = new VsoHash.RollingBlobIdentifier();
     _blockHashes.Clear();
     _finalized = null;
 }
示例#3
0
        /// <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;
            }
        }
示例#4
0
        /// <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);
        }