public async ValueTask <SignatureCollection <TRollingHashAlgorithm, TStrongHashAlgorithm> > ReadSignatures <TRollingHashAlgorithm, TStrongHashAlgorithm> (SignatureOptions options, CancellationToken ct) where TRollingHashAlgorithm : struct, IRollingHashAlgorithm where TStrongHashAlgorithm : IStrongHashAlgorithm { var signatures = new SignatureCollection <TRollingHashAlgorithm, TStrongHashAlgorithm>(); const int maxSignatures = 1 << 22; for (int i = 0; i < maxSignatures; i++) { var sig = await _reader.Read <BlockSignature <TRollingHashAlgorithm, TStrongHashAlgorithm>, SignatureOptions> (options, ct).ConfigureAwait(false); if (!sig.HasValue) { _reader.Complete(); return(signatures); } long start = options.BlockLength * i; #if !NETSTANDARD2_0 signatures.TryAdd(sig.Value, (ulong)start); #else if (!signatures.ContainsKey(sig.Value)) { signatures.Add(sig.Value, (ulong)start); } #endif } throw new FormatException($"too many signatures"); }