public uint FastStreamEncoder(int blockLength, int sourceLength, int extraBlocks = 0)
        {
            sourceLength = Mem.RoundUp(sourceLength, blockLength);
            var targetLength = 2 * sourceLength;

            var source = new byte[sourceLength];
            var target = new byte[targetLength];

            Lorem.Fill(source, 0, source.Length);

            using (var encoder = new LZ4FastEncoder(blockLength, extraBlocks))
            {
                var sourceP = 0;
                var targetP = 0;

                while (sourceP < sourceLength && targetP < targetLength)
                {
                    encoder.TopupAndEncode(
                        source, sourceP, Math.Min(blockLength, sourceLength - sourceP),
                        target, targetP, targetLength - targetP,
                        true, false,
                        out var loaded,
                        out var encoded);
                    sourceP += loaded;
                    targetP += encoded;
                }

                return(Tools.Adler32(target, 0, targetP));
            }
        }