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(); } } }
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);
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); }
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)); }
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); } }
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())); }
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)); }
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); }
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); } }
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(); } }
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()); } } }
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)); } } }
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()); } } }
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); } } }
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()); } } }
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); } } }
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(); } } } }