Пример #1
0
 private ulong UpdateLeafNode(ulong id, LeafNode node, byte[] value)
 {
     if (node.Value.SequenceEqual(value))
     {
         return(id);
     }
     else
     {
         var newId = NewLeafNode(node.KeyHash, value);
         return(newId);
     }
 }
Пример #2
0
        private ulong SplitLeafNode(
            ulong id, LeafNode leafNode, int height, IReadOnlyList <byte> keyHash, IEnumerable <byte> value
            )
        {
            var firstFragment  = HashFragment(leafNode.KeyHash, height);
            var secondFragment = HashFragment(keyHash, height);

            if (firstFragment != secondFragment)
            {
                var secondSon     = NewLeafNode(keyHash, value);
                var secondSonHash = GetNodeById(secondSon)?.Hash;
                if (secondSonHash is null)
                {
                    throw new InvalidOperationException();
                }
                var newId = _versionFactory.NewVersion();
                _nodeCache[newId] = InternalNode.WithChildren(
                    new[] { id, secondSon },
                    new[] { firstFragment, secondFragment },
                    new[] { leafNode.Hash, secondSonHash }
                    );
                return(newId);
            }
            else
            {
                var son     = SplitLeafNode(id, leafNode, height + 1, keyHash, value);
                var sonHash = GetNodeById(son)?.Hash;
                if (sonHash is null)
                {
                    throw new InvalidOperationException();
                }
                var newId = _versionFactory.NewVersion();
                _nodeCache[newId] = InternalNode.WithChildren(new[] { son }, new[] { firstFragment }, new[] { sonHash });
                return(newId);
            }
        }