コード例 #1
0
ファイル: SignatureHelper.cs プロジェクト: KeitoTobi1/core
        private static OmniHash CreateOmniHash(string name, ReadOnlySpan <byte> publicKey, OmniHashAlgorithmType hashAlgorithmType)
        {
            if (name == null)
            {
                throw new ArgumentNullException(nameof(name));
            }

            using (var hub = new BytesHub())
            {
                {
                    var writer = new RocketPackObjectWriter(hub.Writer, BytesPool.Shared);

                    writer.Write(name);
                    writer.Write(publicKey);
                }

                if (hashAlgorithmType == OmniHashAlgorithmType.Sha2_256)
                {
                    var result = new OmniHash(hashAlgorithmType, Sha2_256.ComputeHash(hub.Reader.GetSequence()));

                    return(result);
                }
                else
                {
                    throw new NotSupportedException();
                }
            }
        }
コード例 #2
0
        public static async ValueTask <TValue?> TryGetValueAsync <TKey, TValue>(this IBytesStorage <TKey> bytesStorage, TKey key, CancellationToken cancellationToken = default)
            where TKey : notnull, IEquatable <TKey>
            where TValue : IRocketPackObject <TValue>
        {
            var bytesPool = BytesPool.Shared;

            using var hub = new BytesHub(bytesPool);

            if (!await bytesStorage.TryReadAsync(key, hub.Writer, cancellationToken))
            {
                return(default);
コード例 #3
0
        public static byte[] Utf8StringToBytes(this IBytesToUtf8StringConverter converter, ReadOnlySpan <byte> text)
        {
            using var hub = new BytesHub();
            converter.TryDecode(text, hub.Writer);

            var result = new byte[hub.Writer.WrittenBytes];

            hub.Reader.GetSequence().CopyTo(result);

            return(result);
        }
コード例 #4
0
ファイル: VarintTest.cs プロジェクト: KeitoTobi1/core
        public void EmptyDataGetTest()
        {
            using var hub = new BytesHub();
            var reader = new SequenceReader <byte>(hub.Reader.GetSequence());

            Assert.False(Varint.TryGetUInt8(ref reader, out var result1));
            Assert.False(Varint.TryGetUInt16(ref reader, out var result2));
            Assert.False(Varint.TryGetUInt32(ref reader, out var result3));
            Assert.False(Varint.TryGetUInt64(ref reader, out var result4));
            Assert.False(Varint.TryGetInt8(ref reader, out var result5));
            Assert.False(Varint.TryGetInt16(ref reader, out var result6));
            Assert.False(Varint.TryGetInt32(ref reader, out var result7));
            Assert.False(Varint.TryGetInt64(ref reader, out var result8));
        }
コード例 #5
0
        public static void MessageToStream <T>(T message, Stream stream)
            where T : IRocketPackObject <T>
        {
            using var hub = new BytesHub();

            message.Export(hub.Writer, BytesPool.Shared);

            var sequence = hub.Reader.GetSequence();
            var position = sequence.Start;

            while (sequence.TryGet(ref position, out var memory))
            {
                stream.Write(memory.Span);
            }
        }
コード例 #6
0
        public void WriteAndReadTest()
        {
            var random = new Random(0);

            using var inHub  = new BytesHub();
            using var outHub = new BytesHub();

            var inVersion = (uint)random.Next();
            var inBody    = new byte[random.Next(0, 1024 * 64)];

            random.NextBytes(inBody);

            OmniMessageConverter.TryWrite(inVersion, new ReadOnlySequence <byte>(inBody), inHub.Writer);
            OmniMessageConverter.TryRead(inHub.Reader.GetSequence(), out var outVersion, outHub.Writer);

            var outBody = outHub.Reader.GetSequence().ToArray();

            Assert.True(BytesOperations.Equals(inBody.AsSpan(), outBody.AsSpan()));
        }
コード例 #7
0
        public static T StreamToMessage <T>(Stream inStream)
            where T : IRocketPackObject <T>
        {
            using var hub = new BytesHub();

            const int bufferSize = 4096;

            while (inStream.Position < inStream.Length)
            {
                var readLength = inStream.Read(hub.Writer.GetSpan(bufferSize));
                if (readLength < 0)
                {
                    break;
                }

                hub.Writer.Advance(readLength);
            }

            return(IRocketPackObject <T> .Import(hub.Reader.GetSequence(), BytesPool.Shared));
        }
コード例 #8
0
        public override string ToString()
        {
            if (_toString == null)
            {
                string hashString;

                using (var hub = new BytesHub())
                {
                    // Hash情報をhubへ書き込む。
                    this.Hash.Export(hub.Writer, BytesPool.Shared);

                    // hubからHash情報を読み込み、Base58Btcへ変換する。
                    hashString = OmniBase.Encode(hub.Reader.GetSequence(), ConvertStringType.Base58);
                }

                _toString = StringHelper.Normalize(this.Name) + "@" + hashString;
            }

            return(_toString);
        }
コード例 #9
0
        public static bool TryParse(string item, out OmniSignature?signature)
        {
            if (item == null)
            {
                throw new ArgumentNullException(nameof(item));
            }

            signature = null;

            try
            {
                int index = item.IndexOf('@');
                if (index == -1)
                {
                    return(false);
                }

                // @より前の文字列を取得
                string name = item.Substring(0, index);

                OmniHash omniHash;

                using (var hub = new BytesHub())
                {
                    // @以降の文字列をデコードし、hubへ書き込む。
                    OmniBase.TryDecode(item.Substring(index + 1), hub.Writer);

                    // hubからHash情報を読み取る。
                    omniHash = OmniHash.Import(hub.Reader.GetSequence(), BytesPool.Shared);
                }

                signature = new OmniSignature(name, omniHash);

                return(true);
            }
            catch (Exception)
            {
                return(false);
            }
        }
コード例 #10
0
        public static async IAsyncEnumerable <TValue> GetValuesAsync <TKey, TValue>(this IBytesStorage <TKey> bytesStorage, [EnumeratorCancellation] CancellationToken cancellationToken = default)
            where TKey : notnull, IEquatable <TKey>
            where TValue : IRocketPackObject <TValue>
        {
            var bytesPool = BytesPool.Shared;

            using var hub = new BytesHub(bytesPool);

            await foreach (var key in bytesStorage.GetKeysAsync(cancellationToken))
            {
                if (!await bytesStorage.TryReadAsync(key, hub.Writer, cancellationToken))
                {
                    continue;
                }

                var value = IRocketPackObject <TValue> .Import(hub.Reader.GetSequence(), bytesPool);

                yield return(value);

                hub.Reset();
            }
        }
コード例 #11
0
        static IntSerializeBenchmark()
        {
            {
                var random = new Random(0);

                var elementsList = new List <MessagePack_IntElements>();

                for (int i = 0; i < 32 * 1024; i++)
                {
                    var elements = new MessagePack_IntElements()
                    {
                        X0 = (uint)random.Next(0, 1024 * 256),
                        X1 = (uint)random.Next(0, 1024 * 256),
                        X2 = (uint)random.Next(0, 1024 * 256),
                        X3 = (uint)random.Next(0, 1024 * 256),
                        X4 = (uint)random.Next(0, 1024 * 256),
                        X5 = (uint)random.Next(0, 1024 * 256),
                        X6 = (uint)random.Next(0, 1024 * 256),
                        X7 = (uint)random.Next(0, 1024 * 256),
                        X8 = (uint)random.Next(0, 1024 * 256),
                        X9 = (uint)random.Next(0, 1024 * 256),
                    };

                    elementsList.Add(elements);
                }

                _messagePack_Message = new MessagePack_IntElementsList()
                {
                    List = elementsList.ToArray()
                };
            }

            {
                var random    = new Random(0);
                var bytesPool = BytesPool.Shared;

                using (var hub = new BytesHub(bytesPool))
                {
                    var elementsList = new List <RocketPack_IntElements>();

                    for (int i = 0; i < 32 * 1024; i++)
                    {
                        var X0 = (uint)random.Next(0, 1024 * 256);
                        var X1 = (uint)random.Next(0, 1024 * 256);
                        var X2 = (uint)random.Next(0, 1024 * 256);
                        var X3 = (uint)random.Next(0, 1024 * 256);
                        var X4 = (uint)random.Next(0, 1024 * 256);
                        var X5 = (uint)random.Next(0, 1024 * 256);
                        var X6 = (uint)random.Next(0, 1024 * 256);
                        var X7 = (uint)random.Next(0, 1024 * 256);
                        var X8 = (uint)random.Next(0, 1024 * 256);
                        var X9 = (uint)random.Next(0, 1024 * 256);

                        var elements = new RocketPack_IntElements(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9);
                        elementsList.Add(elements);
                    }

                    _rocketPack_Message = new RocketPack_IntElementsList(elementsList.ToArray());
                }
            }
        }
コード例 #12
0
ファイル: VarintTest.cs プロジェクト: KeitoTobi1/core
        public void BrokenDataGetTest()
        {
            const byte Int8Code  = 0x80;
            const byte Int16Code = 0x81;
            const byte Int32Code = 0x82;
            const byte Int64Code = 0x83;

            {
                using var hub = new BytesHub();
                hub.Writer.Write(new byte[] { Int8Code });
                var reader = new SequenceReader <byte>(hub.Reader.GetSequence());
                Assert.False(Varint.TryGetUInt8(ref reader, out var result1));
            }

            {
                {
                    using var hub = new BytesHub();
                    hub.Writer.Write(new byte[] { Int8Code });
                    var reader = new SequenceReader <byte>(hub.Reader.GetSequence());
                    Assert.False(Varint.TryGetUInt16(ref reader, out var result1));
                }
                {
                    using var hub = new BytesHub();
                    hub.Writer.Write(new byte[] { Int16Code });
                    var reader = new SequenceReader <byte>(hub.Reader.GetSequence());
                    Assert.False(Varint.TryGetUInt16(ref reader, out var result1));
                }
            }

            {
                {
                    using var hub = new BytesHub();
                    hub.Writer.Write(new byte[] { Int8Code });
                    var reader = new SequenceReader <byte>(hub.Reader.GetSequence());
                    Assert.False(Varint.TryGetUInt32(ref reader, out var result1));
                }
                {
                    using var hub = new BytesHub();
                    hub.Writer.Write(new byte[] { Int16Code });
                    var reader = new SequenceReader <byte>(hub.Reader.GetSequence());
                    Assert.False(Varint.TryGetUInt32(ref reader, out var result1));
                }
                {
                    using var hub = new BytesHub();
                    hub.Writer.Write(new byte[] { Int32Code });
                    var reader = new SequenceReader <byte>(hub.Reader.GetSequence());
                    Assert.False(Varint.TryGetUInt32(ref reader, out var result1));
                }
            }

            {
                {
                    using var hub = new BytesHub();
                    hub.Writer.Write(new byte[] { Int8Code });
                    var reader = new SequenceReader <byte>(hub.Reader.GetSequence());
                    Assert.False(Varint.TryGetUInt64(ref reader, out var result1));
                }
                {
                    using var hub = new BytesHub();
                    hub.Writer.Write(new byte[] { Int16Code });
                    var reader = new SequenceReader <byte>(hub.Reader.GetSequence());
                    Assert.False(Varint.TryGetUInt64(ref reader, out var result1));
                }
                {
                    using var hub = new BytesHub();
                    hub.Writer.Write(new byte[] { Int32Code });
                    var reader = new SequenceReader <byte>(hub.Reader.GetSequence());
                    Assert.False(Varint.TryGetUInt64(ref reader, out var result1));
                }
                {
                    using var hub = new BytesHub();
                    hub.Writer.Write(new byte[] { Int64Code });
                    var reader = new SequenceReader <byte>(hub.Reader.GetSequence());
                    Assert.False(Varint.TryGetUInt64(ref reader, out var result1));
                }
            }
        }
コード例 #13
0
        static BytesSerializeBenchmark()
        {
            {
                var random = new Random(0);

                var elementsList = new List <MessagePack_BytesElements>();

                for (int i = 0; i < 10; i++)
                {
                    var elements = new MessagePack_BytesElements()
                    {
                        X0 = new byte[random.Next(0, 1024 * 256)],
                        X1 = new byte[random.Next(0, 1024 * 256)],
                        X2 = new byte[random.Next(0, 1024 * 256)],
                        X3 = new byte[random.Next(0, 1024 * 256)],
                        X4 = new byte[random.Next(0, 1024 * 256)],
                        X5 = new byte[random.Next(0, 1024 * 256)],
                        X6 = new byte[random.Next(0, 1024 * 256)],
                        X7 = new byte[random.Next(0, 1024 * 256)],
                        X8 = new byte[random.Next(0, 1024 * 256)],
                        X9 = new byte[random.Next(0, 1024 * 256)],
                    };

                    elementsList.Add(elements);
                }

                _messagePack_Message = new MessagePack_BytesElementsList()
                {
                    List = elementsList.ToArray()
                };
            }

            {
                var random    = new Random(0);
                var bytesPool = BytesPool.Shared;

                using (var hub = new BytesHub(bytesPool))
                {
                    var elementsList = new List <RocketPack_BytesElements>();

                    for (int i = 0; i < 10; i++)
                    {
                        var X0 = bytesPool.Memory.Rent(random.Next(0, 1024 * 256));
                        var X1 = bytesPool.Memory.Rent(random.Next(0, 1024 * 256));
                        var X2 = bytesPool.Memory.Rent(random.Next(0, 1024 * 256));
                        var X3 = bytesPool.Memory.Rent(random.Next(0, 1024 * 256));
                        var X4 = bytesPool.Memory.Rent(random.Next(0, 1024 * 256));
                        var X5 = bytesPool.Memory.Rent(random.Next(0, 1024 * 256));
                        var X6 = bytesPool.Memory.Rent(random.Next(0, 1024 * 256));
                        var X7 = bytesPool.Memory.Rent(random.Next(0, 1024 * 256));
                        var X8 = bytesPool.Memory.Rent(random.Next(0, 1024 * 256));
                        var X9 = bytesPool.Memory.Rent(random.Next(0, 1024 * 256));

                        var elements = new RocketPack_BytesElements(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9);
                        elementsList.Add(elements);
                    }

                    _rocketPack_Message = new RocketPack_BytesElementsList(elementsList.ToArray());
                }
            }
        }
コード例 #14
0
ファイル: PublishStorage.cs プロジェクト: githubassets/xeus
        public async ValueTask <OmniHash> AddPublishFileAsync(string filePath, CancellationToken cancellationToken = default)
        {
            using (await _asyncLock.LockAsync())
            {
                // 既にエンコード済みの場合の処理
                {
                    if (_publishFilePathToRootHashMap.TryGetValue(filePath, out var rootHash))
                    {
                        return(rootHash);
                    }
                }

                // エンコード処理
                {
                    var tempPath = Path.Combine(_configPath, "_temp_");

                    var merkleTreeSections = new Stack <MerkleTreeSection>();

                    // ファイルからハッシュ値を算出する
                    using (var inStream = new FileStream(filePath, FileMode.Open))
                    {
                        var hashList = new List <OmniHash>();

                        using (var memoryOwner = _bytesPool.Memory.Rent(MaxBlockLength))
                        {
                            var remain = inStream.Length;

                            while (remain > 0)
                            {
                                var blockLength = (int)Math.Min(remain, MaxBlockLength);
                                remain -= blockLength;

                                var memory = memoryOwner.Memory.Slice(0, blockLength);
                                inStream.Read(memory.Span);

                                var hash = new OmniHash(OmniHashAlgorithmType.Sha2_256, Sha2_256.ComputeHash(memory.Span));
                                hashList.Add(hash);
                            }
                        }

                        merkleTreeSections.Push(new MerkleTreeSection(0, (ulong)inStream.Length, hashList.ToArray()));
                    }

                    OmniHash rootHash;

                    // ハッシュ値からMerkle treeを作成する
                    for (; ;)
                    {
                        using var hub = new BytesHub(_bytesPool);

                        var lastMerkleTreeSection = merkleTreeSections.Peek();
                        lastMerkleTreeSection.Export(hub.Writer, _bytesPool);

                        if (hub.Writer.WrittenBytes > MaxBlockLength)
                        {
                            var hashList = new List <OmniHash>();

                            using (var memoryOwner = _bytesPool.Memory.Rent(MaxBlockLength))
                            {
                                var sequence = hub.Reader.GetSequence();
                                var remain   = sequence.Length;

                                while (remain > 0)
                                {
                                    var blockLength = (int)Math.Min(remain, MaxBlockLength);
                                    remain -= blockLength;

                                    var memory = memoryOwner.Memory.Slice(0, blockLength);
                                    sequence.CopyTo(memory.Span);

                                    var hash = new OmniHash(OmniHashAlgorithmType.Sha2_256, Sha2_256.ComputeHash(memory.Span));
                                    hashList.Add(hash);

                                    await this.WriteAsync(tempPath, hash, memory);

                                    sequence = sequence.Slice(blockLength);
                                }
                            }

                            merkleTreeSections.Push(new MerkleTreeSection(merkleTreeSections.Count, (ulong)hub.Writer.WrittenBytes, hashList.ToArray()));
                        }
                        else
                        {
                            using (var memoryOwner = _bytesPool.Memory.Rent(MaxBlockLength))
                            {
                                var sequence = hub.Reader.GetSequence();

                                var memory = memoryOwner.Memory.Slice(0, (int)sequence.Length);
                                sequence.CopyTo(memory.Span);

                                var hash = new OmniHash(OmniHashAlgorithmType.Sha2_256, Sha2_256.ComputeHash(memory.Span));

                                await this.WriteAsync(tempPath, hash, memory);

                                rootHash = hash;
                            }

                            break;
                        }
                    }

                    // 一時フォルダからキャッシュフォルダへ移動させる
                    {
                        var cachePath = Path.Combine(_configPath, this.OmniHashToFilePath(rootHash));
                        Directory.Move(tempPath, cachePath);
                    }

                    var status = new PublishFileStatus(rootHash, filePath, merkleTreeSections.ToArray());
                    _publishFileStatusMap.Add(rootHash, status);

                    _publishFilePathToRootHashMap[filePath] = rootHash;

                    return(rootHash);
                }
            }
        }
コード例 #15
0
        static StringSerializeBenchmark()
        {
            var charList = new char[] { 'A', 'B', 'C', 'D', 'E', '安', '以', '宇', '衣', '於' };

            string GetRandomString(Random random)
            {
                var sb = new StringBuilder();

                for (int i = random.Next(32, 256) - 1; i >= 0; i--)
                {
                    sb.Append(charList[random.Next(0, charList.Length)]);
                }

                return(sb.ToString());
            }

            {
                var random = new Random(0);

                var elementsList = new List <MessagePack_StringElements>();

                for (int i = 0; i < 32 * 1024; i++)
                {
                    var elements = new MessagePack_StringElements()
                    {
                        X0 = GetRandomString(random),
                        X1 = GetRandomString(random),
                        X2 = GetRandomString(random),
                        X3 = GetRandomString(random),
                        X4 = GetRandomString(random),
                        X5 = GetRandomString(random),
                        X6 = GetRandomString(random),
                        X7 = GetRandomString(random),
                        X8 = GetRandomString(random),
                        X9 = GetRandomString(random),
                    };

                    elementsList.Add(elements);
                }

                _messagePack_Message = new MessagePack_StringElementsList()
                {
                    List = elementsList.ToArray()
                };
            }

            {
                var random    = new Random(0);
                var bytesPool = BytesPool.Shared;

                using (var hub = new BytesHub(bytesPool))
                {
                    var elementsList = new List <RocketPack_StringElements>();

                    for (int i = 0; i < 32 * 1024; i++)
                    {
                        var X0 = GetRandomString(random);
                        var X1 = GetRandomString(random);
                        var X2 = GetRandomString(random);
                        var X3 = GetRandomString(random);
                        var X4 = GetRandomString(random);
                        var X5 = GetRandomString(random);
                        var X6 = GetRandomString(random);
                        var X7 = GetRandomString(random);
                        var X8 = GetRandomString(random);
                        var X9 = GetRandomString(random);

                        var elements = new RocketPack_StringElements(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9);
                        elementsList.Add(elements);
                    }

                    _rocketPack_Message = new RocketPack_StringElementsList(elementsList.ToArray());
                }
            }
        }
コード例 #16
0
        static BytesDeserializeBenchmark()
        {
            {
                var random = new Random(0);

                var elementsList = new List <MessagePack_BytesElements>();

                for (int i = 0; i < 10; i++)
                {
                    var elements = new MessagePack_BytesElements()
                    {
                        X0 = new byte[random.Next(0, 1024 * 256)],
                        X1 = new byte[random.Next(0, 1024 * 256)],
                        X2 = new byte[random.Next(0, 1024 * 256)],
                        X3 = new byte[random.Next(0, 1024 * 256)],
                        X4 = new byte[random.Next(0, 1024 * 256)],
                        X5 = new byte[random.Next(0, 1024 * 256)],
                        X6 = new byte[random.Next(0, 1024 * 256)],
                        X7 = new byte[random.Next(0, 1024 * 256)],
                        X8 = new byte[random.Next(0, 1024 * 256)],
                        X9 = new byte[random.Next(0, 1024 * 256)],
                    };

                    elementsList.Add(elements);
                }

                _messagePack_Bytes = MessagePack.MessagePackSerializer.Serialize(new MessagePack_BytesElementsList()
                {
                    List = elementsList.ToArray()
                });
            }

            {
                var bytesPool = BytesPool.Shared;
                var random    = new Random(0);
                using (var hub = new BytesHub(bytesPool))
                {
                    var elementsList = new List <RocketPack_BytesElements>();

                    for (int i = 0; i < 10; i++)
                    {
                        var X0 = bytesPool.Memory.Rent(random.Next(0, 1024 * 256));
                        var X1 = bytesPool.Memory.Rent(random.Next(0, 1024 * 256));
                        var X2 = bytesPool.Memory.Rent(random.Next(0, 1024 * 256));
                        var X3 = bytesPool.Memory.Rent(random.Next(0, 1024 * 256));
                        var X4 = bytesPool.Memory.Rent(random.Next(0, 1024 * 256));
                        var X5 = bytesPool.Memory.Rent(random.Next(0, 1024 * 256));
                        var X6 = bytesPool.Memory.Rent(random.Next(0, 1024 * 256));
                        var X7 = bytesPool.Memory.Rent(random.Next(0, 1024 * 256));
                        var X8 = bytesPool.Memory.Rent(random.Next(0, 1024 * 256));
                        var X9 = bytesPool.Memory.Rent(random.Next(0, 1024 * 256));

                        var elements = new RocketPack_BytesElements(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9);
                        elementsList.Add(elements);
                    }

                    var message = new RocketPack_BytesElementsList(elementsList.ToArray());

                    message.Export(hub.Writer, BytesPool.Shared);

                    _rocketPack_Bytes = new byte[hub.Writer.WrittenBytes];
                    hub.Reader.GetSequence().CopyTo(_rocketPack_Bytes);
                }
            }
        }
コード例 #17
0
ファイル: VarintTest.cs プロジェクト: KeitoTobi1/core
        public void RandomTest()
        {
            var random = new Random(0);

            using (var hub = new BytesHub())
            {
                for (int i = 0; i < 32; i++)
                {
                    foreach (var result1 in GenRandomValue(random, 8).Select(n => (byte)n))
                    {
                        Varint.SetUInt8(result1, hub.Writer);

                        var reader = new SequenceReader <byte>(hub.Reader.GetSequence());
                        Varint.TryGetUInt8(ref reader, out var result2);

                        Assert.Equal(result1, result2);

                        hub.Reset();
                    }
                }
            }

            using (var hub = new BytesHub())
            {
                for (int i = 0; i < 32; i++)
                {
                    foreach (var result1 in GenRandomValue(random, 16).Select(n => (ushort)n))
                    {
                        Varint.SetUInt16(result1, hub.Writer);

                        var reader = new SequenceReader <byte>(hub.Reader.GetSequence());
                        Varint.TryGetUInt16(ref reader, out var result2);

                        Assert.Equal(result1, result2);

                        hub.Reset();
                    }
                }
            }

            using (var hub = new BytesHub())
            {
                for (int i = 0; i < 32; i++)
                {
                    foreach (var result1 in GenRandomValue(random, 32).Select(n => (uint)n))
                    {
                        Varint.SetUInt32(result1, hub.Writer);

                        var reader = new SequenceReader <byte>(hub.Reader.GetSequence());
                        Varint.TryGetUInt32(ref reader, out var result2);

                        Assert.Equal(result1, result2);

                        hub.Reset();
                    }
                }
            }

            using (var hub = new BytesHub())
            {
                for (int i = 0; i < 32; i++)
                {
                    foreach (var result1 in GenRandomValue(random, 64).Select(n => (ulong)n))
                    {
                        Varint.SetUInt64(result1, hub.Writer);

                        var reader = new SequenceReader <byte>(hub.Reader.GetSequence());
                        Varint.TryGetUInt64(ref reader, out var result2);

                        Assert.Equal(result1, result2);

                        hub.Reset();
                    }
                }
            }

            using (var hub = new BytesHub())
            {
                for (int i = 0; i < 32; i++)
                {
                    foreach (var result1 in GenRandomValue(random, 8).Select(n => (sbyte)n))
                    {
                        Varint.SetInt8(result1, hub.Writer);

                        var reader = new SequenceReader <byte>(hub.Reader.GetSequence());
                        Varint.TryGetInt8(ref reader, out var result2);

                        Assert.Equal(result1, result2);

                        hub.Reset();
                    }
                }
            }

            using (var hub = new BytesHub())
            {
                for (int i = 0; i < 32; i++)
                {
                    foreach (var result1 in GenRandomValue(random, 16).Select(n => (short)n))
                    {
                        Varint.SetInt16(result1, hub.Writer);

                        var reader = new SequenceReader <byte>(hub.Reader.GetSequence());
                        Varint.TryGetInt16(ref reader, out var result2);

                        Assert.Equal(result1, result2);

                        hub.Reset();
                    }
                }
            }

            using (var hub = new BytesHub())
            {
                for (int i = 0; i < 32; i++)
                {
                    foreach (var result1 in GenRandomValue(random, 32).Select(n => (int)n))
                    {
                        Varint.SetInt32(result1, hub.Writer);

                        var reader = new SequenceReader <byte>(hub.Reader.GetSequence());
                        Varint.TryGetInt32(ref reader, out var result2);

                        Assert.Equal(result1, result2);

                        hub.Reset();
                    }
                }
            }

            using (var hub = new BytesHub())
            {
                for (int i = 0; i < 32; i++)
                {
                    foreach (var result1 in GenRandomValue(random, 64).Select(n => (long)n))
                    {
                        Varint.SetInt64(result1, hub.Writer);

                        var reader = new SequenceReader <byte>(hub.Reader.GetSequence());
                        Varint.TryGetInt64(ref reader, out var result2);

                        Assert.Equal(result1, result2);

                        hub.Reset();
                    }
                }
            }
        }