【USENIX论文阅读】Day2

Birds of a Feather Flock Together: How Set Bias Helps to Deanonymize You via Revealed Intersection Sizes("物以类聚:集合偏差如何帮助去匿名化——通过揭示交集大小)

Xiaojie Guo, Ye Han, Zheli Liu, Ding Wang, Yan Jia, Jin Li

摘要

安全的两方协议,用于计算与交集相关的统计信息,受到了工业界的广泛关注。这些协议使得两个组织能够共同计算一个函数(例如计数和求和),而无需明确揭示交集。然而,大多数这类协议最终会揭示两个集合的交集大小。在这项工作中,我们关注的是攻击者能够利用揭示的交集大小,推断一个组织集合中一些元素的成员资格的程度。甚至将一个元素的成员资格向另一个组织披露,也可能违反隐私法规(例如GDPR),因为这样的元素通常用于在两个组织之间识别一个人。我们是第一个研究在揭示交集大小的协议中集合成员泄漏的团队。我们提出了两种攻击,即基线攻击特征感知攻击,以在现实场景中评估这种泄漏。特别是,我们的特征感知攻击利用了现实中的集合偏差,即具有特定特征的元素更有可能是一个组织集合的成员。结果显示,我们的两种攻击可以在三种现实场景中平均推断出2.0∼72.7个集合成员。如果集合偏差不弱,特征感知攻击将优于基线攻击。例如,在COVID-19接触追踪中,特征感知攻击在135个协议调用中可以找到25.9个感染患者的标记,比基线攻击多出1.5倍。我们讨论了这类结果可能造成的负面实际影响,并提出了可能的对抗我们攻击的防御措施。

1 引言

涉及两个组织集合交集的安全双方计算引起了行业的广泛关注。一个知名的协议是私有集合交集基数(PSI-CA),该协议向一个组织返回交集的大小,而不向任何一方透露其他信息。该协议在追踪社交网络和关联规则挖掘等领域得到了广泛应用。另一个流行的协议是带基数的私有交集求和(PSI-SUM),该协议汇总了一个组织持有的与交集中索引相关联的值。PSI-SUM最初是在Google的工作中提出的,用于衡量由于广告转化而产生的收入。最近,Facebook提出了Private-ID,这是一种用于在线广告中隐私保护测量转化提升[13]的协议。

尽管这些安全计算协议永远不会向任何一方透露两个组织集合的交集,但它们会揭示两个集合的交集大小。只要在两个组织之间反复调用这种揭示交集大小的协议,攻击就可以利用揭示的交集大小测试某些元素是否在交集中。在这种攻击中,一个组织(充当攻击者)可以在每次与另一个组织(充当受害者)的协议调用中输入一个单元素集,并观察结果的交集大小。如果这个大小等于一,那么涉及的元素就在交集中;否则,不在。我们强调攻击者可以在协议调用中使用其目标元素,而这些元素的成员资格基本上会透露它们属于受害者集合的成员资格。换句话说,这种攻击允许攻击者推断目标元素属于受害者集合的成员资格。如果受害者集合是静态的,N次协议调用可以泄露N个元素的集合成员资格

我们的研究超越了这种攻击,并启动了有关由揭示的交集大小导致的集合成员泄漏的首次研究。这种泄漏对于所有在不透露关于交集的任何信息的情况下计算与交集相关的统计量的协议都是一个普遍问题,许多现实世界的系统使用这些协议来尽可能隐藏有关受害者集的信息免受攻击者的侵害。在这些系统中,不允许透露受害者集中的任何元素。然而,本研究表明,对于具有这种安全要求的系统来说,使用揭示交集大小的协议可能存在风险。

本研究始于设计两种集合成员推断攻击,以测试目标元素是否在受害者集中。首先,我们展示,即使攻击者什么都不知道,只知道交集的大小,也存在一种基线攻击,导致比玩具攻击更严重的集合成员泄漏。其次,我们考虑了一个现实情况,即受害者集在特定特征方面存在偏差。粗略地说,这种集合偏差意味着具有这些特征的元素更有可能包含在受害者集中。例如,在卫生局的COVID-19患者集中存在这种集合偏差。该集合被认为在人的发热特征方面存在偏差,因为发热是COVID-19的常见症状。我们提出了针对这种有偏集合的特征感知攻击。其直觉是,如果攻击者知道目标元素的与偏差相关的特征,它可以利用这些特征来提高推断效率

本研究进一步评估了在三种情景下,由我们的两种攻击及玩具攻击导致的集合成员泄露问题:(i) 基于PSI-CA的COVID-19接触追踪,(ii) 从PSI-SUM测量广告转化收入,(iii) 通过PrivateID测量广告转化提升。我们的测量显示,情景(i)中的集合偏差是不可忽视的,而其他两个情景中的偏差较弱。每个情景都允许多次调用其揭示交集大小的协议,其中受害者的集合是动态的。

在情景(i)中,我们的基线(特征感知)攻击能够识别出3.7 ∼ 7.2倍(5.2 ∼ 9.0倍)比玩具攻击更多的集合成员。特别是,我们的攻击需要远少于玩具攻击的协议调用次数来找到同样多的集合成员。平均而言,当最初有14/28/56个集合成员在512/1024/2048个目标元素中时,我们的基线(特征感知)攻击大约通过70/135/135次协议调用就能找到12.0/18.1/17.6(13.4/22.4/25.9)个集合成员。在情景(ii)和(iii)中,玩具攻击可能无法找到任何集合成员,但我们的攻击仍然有效。例如,在情景(ii)中,当最初有2/4/7个集合成员在512/1024/2048个目标元素中时,我们的基线(特征感知)攻击大约通过15/33/60次协议调用能找到2.0/4.0/7.5(2.0/4.2/7.5)个集合成员。由于受害者的集合随时间变化,我们的攻击在这一情景中可以找到与最初不同的一些集合成员。上述结果表明,我们的攻击可以帮助攻击者在三种情景中猜测受害者集合中的元素。

本工作最后讨论了我们的结果在现实世界中的含义以及一些可能的防御措施。值得注意的是,在考虑的情景中,攻击者可以将其选择的元素与现实世界中的人联系起来。因此,这些元素的集合成员泄露表明了与受害者交互的联系人,进而他们的相关元素被记录在受害者的集合中。这种个人信息应仅为交互组织所知,而这些信息被泄露给另一个未经授权的组织违反了隐私法规(例如,GDPR和HIPPA)。我们还讨论了这种交互泄露在三种情景中可能产生的负面后果。例如,结果表明,结合我们的攻击和链接攻击,可以推断出由卫生局记录的COVID-19患者。这种推断可能影响这些患者的日常生活。

2 背景

2.1 交集大小揭示协议

存在许多安全的双方协议,可以计算两方集合的交集函数,而不透露关于交集的任何信息,除了其大小

  • PSI-CA:该协议是一个黑盒,从一方接收集合 X X X,从另一方接收集合 Y Y Y。它在内部计算交集大小 ∣ X ∩ Y ∣ |X ∩Y| XY 并将此值发送给两方中的一方。

  • PSI-SUM :该协议是一个黑盒,从一方接收集合 X X X,从另一方接收索引-值对的表 ( y i , v i ) {(y_i, v_i)} (yi,vi),它在内部聚合与交集 X ∩ Y X ∩ Y XY中的索引相关联的值,并得到总和 ∑ y i ∈ X ∩ Y v i \sum_{y_i∈X∩Y} v_i yiXYvi。然后,该协议将此总和和交集大小 ∣ X ∩ Y ∣ |X ∩ Y| XY发送给输入表的一方。

  • Private-ID:该协议是一个黑盒,从一方接收集合 X X X,从另一方接收集合 Y Y Y。它内部为联合 X ∪ Y X ∪ Y XY 中的所有元素分配随机标签,以便两方对于交集 X ∩ Y X ∩Y XY 中的每个元素都将获得相同的标签。然后,该协议将这些标签和交集大小 ∣ X ∩ Y ∣ |X ∩Y| XY 发送给双方。这些标签可用于后续安全计算交集 X ∩ Y X ∩Y XY 的许多统计信息。

  • Circuit-based PSI:该协议是一个黑盒,从一方接收表 ( x i , u i ) {(x_i, u_i)} (xi,ui),从另一方接收表 ( y i , v i ) {(y_i, v_i)} (yi,vi)。基于电路的PSI 可以计算由交集 X ∩ Y X ∩ Y XY 中的元素索引的两方值的任何函数。可以认为基于电路的PSI 是计算与交集相关的统计信息的最终解决方案。实现了基于电路的PSI 协议,并向两方透露交集大小 ∣ X ∩ Y ∣ |X ∩Y| XY 以提高协议效率。

集合成员推断问题:对于接收来自揭示交集大小的协议的一方,这个大小衡量了其集合与另一方集合之间的相似性。由于该方可以选择发送到协议的集合,它可以以其希望的方式测量另一方的集合。一个有趣的问题是,当一方拥有许多目标元素时,是否可以利用这种测量能力确定这些元素是否属于另一方的集合。

2.2 威胁模型

攻击者的能力:攻击者具有以下能力:

  • 攻击者是交集大小显露协议的一方。在每次协议调用中,攻击者可以选择其输入并了解由该输入和另一方集合导致的交集大小。在此,另一方是受害者,其集合可以是动态的。
  • 攻击者被允许重复使用相同的受害者调用协议。

攻击者的背景知识:我们考虑以下两种背景知识的攻击者:

  • 基线攻击者:该攻击者对受害者的集合没有任何背景知识。我们使用该攻击者的性能来衡量由交集大小显露协议导致的最小集合成员泄露
  • 特征感知攻击者:该攻击者知道某些特征与受害者集合中的偏差相关。换句话说,攻击者知道受害者的集合倾向于包含具有特定特征的元素。这是关于受害者集合中偏差的背景知识。

攻击者的目标

攻击者有许多目标元素,并对这些元素是否属于受害者的集合感兴趣。如果这个集合随时间变化,攻击者将考虑目标元素的历史集合成员资格,这表示目标元素是否出现在受害者集合的任何快照中,从攻击开始到结束。

3 集合成员推断攻击

3.1 基线攻击

基线攻击者采用一种类似二分搜索的策略。首先构建这样一棵二叉树,其中(i)每个节点存储一个非空集合,(ii)根节点存储目标元素的集合,(iii)非叶节点中存储的集合将被分为两个非空且不相交的子集,这两个子集将分别存储在非叶节点的两个子节点中。

对于二叉树T的节点v,令 T v ∈ X T_v \in X TvX 表示节点v中存储的集合,leftChild(v)(rightChild(v))表示v的左(右)子节点。我们的基线攻击按照Algorithm 1中的蓝图进行,并使用Algorithm 2作为子例程来构建二叉树。

Algorithm 2: 基线攻击者的buildTree算法

输入:一个集合X。忽略参数BK。
输出:一棵二叉树T。

1. 初始化T,包含一个单独的节点root,该节点存储集合X。
2. 通过递归将存储的集合分割成两个非空且不相交的子集,构建一棵平衡的二叉树T。
3. 返回T。。

Algorithm 2 举例
假设广告公司想要在某一城市的特定区域中进行广告投放,并希望了解哪些年龄段对他们的广告产生了转化。为简化问题,我们将用户按照年龄进行分类,每个用户由其年龄代表。我们的目标是使用集合成员推断攻击构建一棵平衡的二叉树,从而推断出对广告产生转化的年龄段。

  1. 初始化: 初始时,我们有一个包含该城市所有年龄段的用户集合X。算法初始化一棵二叉树,根节点表示整个年龄段集合。
  2. 递归划分: 通过递归地将年龄段集合划分为两个非空且不相交的子集,构建平衡的二叉树。例如,我们可以选择按照年龄中位数来划分。假设初始年龄段为20到60岁,我们选择将其划分为两个子集:20到40岁和40到60岁。这两个子集分别成为根节点的左右子节点。
  3. 继续划分: 针对每个非叶子节点,我们重复递归地划分其存储的年龄段集合(按照年龄中位数来划分),直到达到某个终止条件。每一步的划分都确保子集的平衡性,以保持二叉树的平衡性。
  4. 构建平衡的二叉树: 通过反复划分和构建,我们最终得到一棵平衡的二叉树,其中每个节点存储一个年龄段集合。叶子节点表示最小的年龄段,即单个年龄

为了推断目标元素的集合成员资格,攻击者对排队的子树运行深度优先搜索(DFS)(队列最初包含构建的二叉树)。在每次DFS中,攻击者(i)遍历从队列弹出的子树,(ii)与受害者调用协议以接收有关访问过的每个节点中存储的集合的交集大小,(iii)在存储集合大小等于接收到的交集大小的节点处终止。在此搜索期间未访问的子树被推入队列以供将来的DFS(第16和19行)。最后,攻击者清空队列并找到包含受害者也持有的目标元素的所有子集。同时,攻击者可以看到其他目标元素是非成员。

Algorithm 1: Blueprint of set membership inference

Input: A set X of target elements, background knowledge
BK, an algorithm buildTree.

Output: A set membership predicate σ such that, for each
xi ∈ X, σ(xi) = 1 if xi is in the victim’s set; otherwise σ(xi) = 0.

1 Initialize Z ← ∅.
2 Input X to the protocol and get an intersection size m.
3 T ← buildTree(X,BK). // Build a binary tree based on the
attacker’s background knowledge
4 forest ← {(m/|X|,(m,T.root))}. // A priority queue of
(priority, subtree-info) tuples
5 while forest is not empty do
6 		(mnode,node) ← forest.pop().
7 		while 0 < mnode < |Tnode| do
8 			L ← leftChild(node), R ← rightChild(node).
9 			if TR contains more elements than TL then
10 				Input TL to the protocol and get an intersection size mL.
11 				mR ← mnode −mL.
12 			else
13 				Input TR to the protocol and get an intersection size mR.
14 				mL ← mnode −mR.
15 			if mR/|TR| > mL/|TL| then
16 				forest.push((mL/|TL|,(mL,L))).
17 				node ← R, mnode ← mR. // Goto right child
18 			else
19 				forest.push((mR/|TR|,(mR,R))).
20 				node ← L, mnode ← mL. // Goto left child
21 		if mnode > 0 then Z ← Z ∪Tnode.
22 	Let σ be such a predicate that σ(xi) = 1 iff xi ∈ X ∩Z.
23 return σ.

该算法的目标是通过构建一个二叉树,利用协议和交集大小的信息来推断目标元素是否属于受害者的集合。算法维护一个优先级队列,其中包含了以交集大小为优先级的子树信息。通过迭代地从队列中弹出子树并进行协议调用,算法构建了一颗二叉树,最终得到一个集合成员谓词σ,用于确定每个目标元素是否属于受害者的集合。

剩下的问题是基线攻击者如何划分存储在非叶节点中的集合。回想一下,对于基线攻击者,每个目标元素成为集合成员的概率相同。对于这个攻击者来说,最好是随机均匀地划分集合并最终构建一棵平衡的二叉树。这种做法确保DFS路径的期望长度最小,或者说期望的协议调用次数最小。

我们的基线攻击比玩具攻击更高效,这归功于类似二分搜索的策略。假设受害者的集合Y是静态的,并且攻击者已构建了一个二进制树T。我们的第一个观察是对于树T的任何非叶节点v,以下等式成立:
∣ T v ∩ Y ∣ = ∣ T leftChild ( v ) ∩ Y ∣ + ∣ T rightChild ( v ) ∩ Y ∣ . |T_v \cap Y| = |T_{\text{leftChild}(v)} \cap Y| + |T_{\text{rightChild}(v)} \cap Y|. TvY=TleftChild(v)Y+TrightChild(v)Y∣.
通过这个等式,如果攻击者已经学到了父节点的大小(例如, ∣ T v ∩ Y ∣ |T_v \cap Y| TvY)和另一个子节点的大小(例如, ∣ T leftChild ( v ) ∩ Y ∣ |T_{\text{leftChild}(v)} \cap Y| TleftChild(v)Y),则攻击者可以局部确定一个子节点的交集大小(例如, ∣ T rightChild ( v ) ∩ Y ∣ |T_{\text{rightChild}(v)} \cap Y| TrightChild(v)Y)。因此,攻击者可以避免对那些可以在本地确定的交集大小进行徒劳的调用。在我们的实现中,攻击者利用这一性质来维护子树队列,其中每个推送的子树的根的交集大小(除了初始情况)已经在本地确定(见第16和19行)。这使得攻击者可以至少减少二叉树每个非根层的协议调用次数的一半。

回顾一下,在具有 N : = ∣ X ∣ N := |X| N:=X 个叶节点的平衡二叉树中,有 2 N − 2 2N − 2 2N2个叶节点,深度为 ⌈ log ⁡ 2 N ⌉ \lceil \log_2 N \rceil log2N 。对于确定二叉树上所有交集大小所需的总调用次数,有一个上限:
1 + 1 2 ⋅ ∑ d = 1 ⌈ log ⁡ 2 N ⌉ − 1 2 d + 1 2 ⋅ ( 2 N − 2 ) ⌈ log ⁡ 2 N ⌉ = N . 1 + \frac{1}{2} \cdot \sum_{d=1}^{\lceil \log_2 N \rceil - 1} 2^d + \frac{1}{2} \cdot \left(2N − 2\right)^{\lceil \log_2 N \rceil} = N. 1+21d=1log2N12d+21(2N2)log2N=N.
这等于玩具攻击所需的总调用次数。这个上限保证我们的基线攻击的效率不会比玩具攻击差。

我们的第二个观察是,这个上限是宽松的,因为每个深度优先搜索(DFS)可能会在深度小于 ⌈ log ⁡ 2 N ⌉ \lceil \log_2 N \rceil log2N 的非叶节点处提前终止。这种提前终止是因为一些目标元素的各个单例集合被合并成受害者集合的较大子集。当DFS遇到这个子集时,攻击者将了解一批目标元素的集合成员资格并终止此DFS。在这种情况下,由于DFS路径的缩短,调用次数减少。此外,剩余目标元素的数量也减少,并且需要更少的DFS通行来进行进一步的推断。因此,我们的基线攻击应比玩具攻击更为高效。

效率优化:贪心深度优先搜索(DFS)。由于合并集合成员可以提高攻击效率,攻击者应首先搜索具有最大合并概率的子树。这个概率与子树根的交集大小与该子树中目标元素数量的比率正相关。攻击者了解这个比率,并且可以将这个比率作为优先级分数,用于对推送到(优先级)队列中的子树进行排序。这样,攻击者将首先在具有最大合并概率的弹出子树上运行DFS。在每次DFS中,攻击者递归访问具有最大优先级分数的子节点。图1中呈现了一个示例。

图1

Algorithm 3: buildTree for the feature-aware attacker

Input: A set X, background knowledge BK.
Output: A binary tree T.

1 Parse BK as a table DX such that DX [xi
] denotes the features
associated with a target element xi ∈ X.
2 Initialize T to contain a single node root.
3 Troot ← X, queue ← {root}.
4 while queue is not empty do
5 	node ← queue.pop().
6 	Use features {xi ∈ Tnode : DX [xi
]} to run k-means to divide Tnode into two subsets SL and SR.
7 	Append two child nodes L and R to node.
8 	TL ← SL, TR ← SR.
9 if |SL| > 1 then queue.push(L).
10 if |SR| > 1 then queue.push(R).
11 return T.

该算法的目的是根据给定的集合X和背景知识BK,构建一个二叉树,其中每个节点代表一个子集,通过k均值算法不断划分子集,直到子集中的元素数量满足某个条件。这样的二叉树结构可以用于特征感知的攻击,从而更有效地获取目标元素的信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/409644.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WordPress如何将后台右上角管理员头像去除并调整注销位置及启用注销确认功能?

WordPress后台默认情况下右上角可以看到管理员昵称和头像&#xff0c;将鼠标移动到该昵称上还会出现一个下拉菜单&#xff0c;点击下拉菜单中的“注销”无需我们再次确认就会自动退出。 现在我想将WordPress后台右上角的管理员头像和管理员昵称子菜单去除&#xff0c;并将“注销…

测试C#使用ViewFaceCore实现图片中的人脸遮挡

基于ViewFaceCore和DlibDotNet都能实现人脸识别&#xff0c;准备做个遮挡图片中人脸的程序&#xff0c;由于暂时不清楚DlibDotNet返回的人脸尺寸与像素的转换关系&#xff0c;最终决定使用ViewFaceCore实现图片中的人脸遮挡。   新建Winform项目&#xff0c;在Nuget包管理器中…

zemax人眼模型

人眼模型可以从下面这张图来提取 按照前后顺序&#xff0c;简化模型中跟成像直接相关的就是&#xff1a; 角膜、前方&#xff08;液状体&#xff09;、瞳孔、晶状体、玻璃体、视网膜 一般情况下我们认为瞳孔可以作为光阑 入瞳4mm视场&#xff08;近轴像高&#xff09;5波长0…

Redis主从、哨兵、Redis Cluster集群架构

Redis主从、哨兵、Redis Cluster集群架构 Redis主从架构 Redis主从架构搭建 主从搭建的问题 如果同步数据失败&#xff0c;查看log日志报错无法连接&#xff0c;检查是否端口未开放出现”Error reply to PING from master:...“日志&#xff0c;修改参数protected-mode no …

免编程经验,搭建宠物店小程序轻松实现

在如今的互联网时代&#xff0c;小程序商城已成为各行业推广和销售的热门方式。对于花店来说&#xff0c;搭建一个自己的小程序商城不仅可以提升品牌形象&#xff0c;还可以方便顾客在线选购花卉产品。下面就来教大家如何轻松搭建一个花店小程序商城&#xff0c;并通过引流获得…

Spring ReflectionUtils 反射工具介绍和使用

一、ReflectionUtils 在 Java 中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时动态地检查类、获取类的信息、调用类的方法、访问或修改类的属性等。Java 的反射机制提供了一组类和接口&#xff0c;位于 java.lang.reflect…

消息中间件篇之RabbitMQ-消息重复消费

一、导致重复消费的情况 1. 网络抖动。 2. 消费者挂了。 消费者消费消息后&#xff0c;当确认消息还没有发送到MQ时&#xff0c;就发生网络抖动或者消费者宕机。那当消费者恢复后&#xff0c;由于MQ没有收到消息&#xff0c;而且消费者有重试机制&#xff0c;消费者就会再一次消…

SpringCloud(17)之SpringCloud Stream

一、Spring Cloud Stream介绍 Spring Cloud Stream是一个框架&#xff0c;用于构建与共享消息系统连接的高度可扩展的事件驱动微服务。该框架提供了一个灵活的编程模型&#xff0c;该模型建立在已经建立和熟悉的Spring习惯用法和最佳实践之上&#xff0c;包括对持久发布/子语义…

《高考》期刊杂志投稿邮箱知网教育类期刊发表

《高考》杂志是由国家新闻出版总署批准的正规教育类期刊。主要宣传高中新课程改革的专业性&#xff0c;是教育管理工作者、高中一线教师交流经验、探讨问题的重要平台&#xff0c;期刊突出政策性、针对性、指导性&#xff0c;是一本以教育科研成果展示为主&#xff0c;兼具教育…

redis数据结构源码分析——压缩列表ziplist(I)

前面讲了跳表的源码分析&#xff0c;本篇我们来聊一聊另外一个重点结构——压缩列表 文章目录 存储结构字节数组结构节点结构 压缩编码zipEntryzlEntry ZIP_DECODE_PREVLENZIP_DECODE_LENGTH API解析ziplistNew(创建压缩列表)ziplistInsert(插入)ziplistDelete(删除)ziplistFi…

一. demo

1. 舞台-场景-控件 import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.Pane; import javafx.scene.layout.VBox; import javafx.stage.Stage;import java.util.Arrays;public class Main e…

数据结构(算法竞赛、蓝桥杯)--线段树+懒标记

1、B站视频链接&#xff1a;C02【模板】线段树懒标记 Luogu P3372 线段树 1_哔哩哔哩_bilibili 题目链接&#xff1a;P3372 【模板】线段树 1 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) void build(int p,int l,int r){tr[p]{l,r,w[l],0};if(lr)return;//叶子节点返回int…

快速搭建keepalived+nginx

1.工作原理 keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。 虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面…

蓝桥杯《修剪灌木》

题目描述 爱丽丝要完成一项修剪灌木的工作。有 N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晚会修剪一棵灌木&#xff0c;让灌木的高度变为 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始&#xff0c;每天向右修剪一棵灌木。当修剪了最右侧的灌木后&#xff0c;她会…

Java 中常用的数据结构类 API

目录 常用数据结构API 对应的线程安全的api 高可用衡量标准 常用数据结构API ArrayList: 实现了动态数组&#xff0c;允许快速随机访问元素。 import java.util.ArrayList; LinkedList: 实现了双向链表&#xff0c;适用于频繁插入和删除操作。 import java.util.LinkedLis…

【MySQL面试复习】详细说下事务的特性

系列文章目录 在MySQL中&#xff0c;如何定位慢查询&#xff1f; 发现了某个SQL语句执行很慢&#xff0c;如何进行分析&#xff1f; 了解过索引吗&#xff1f;(索引的底层原理)/B 树和B树的区别是什么&#xff1f; 什么是聚簇索引&#xff08;聚集索引&#xff09;和非聚簇索引…

【泰山派RK3566】智能语音助手(一)移植Kaldi语音转文字

文章目录 移植过程硬件资源下载测试 移植过程 参考我的这篇博客 【RV1126】移植kaldi实时语音识别 硬件 资源下载 链接&#xff1a;https://pan.baidu.com/s/1x1udT5eNzzQHoPOTCQ182A?pwdlief 提取码&#xff1a;lief –来自百度网盘超级会员V6的分享 下载的文件里面有一个…

leetcode:46.全排列

1.什么是排列&#xff1f; 有顺序&#xff01;&#xff01; 2.树形结构&#xff1a; 使用used数组进行标记取过的元素&#xff0c;一个元素一个元素地进行取值&#xff0c;取完之后将used数组进行标记。 3.代码实现&#xff1a;&#xff08;循环从i0开始&#xff0c;而不是…

区分服务 DiffServ

目录 区分服务 DiffServ 区分服务的基本概念 区分服务 DiffServ 的要点 每跳行为 PHB DiffServ 定义的两种 PHB 区分服务 DiffServ 区分服务的基本概念 由于综合服务 IntServ 和资源预留协议 RSVP 都较复杂&#xff0c;很难在大规模的网络中实现&#xff0c;因此 IET…

C#常识篇(二)

委托和事件的区别 委托可以认为是对指定签名的函数的引用&#xff0c;通过委托可以实现将函数作为参数传递或者间接调用函数&#xff0c;委托是类型安全的&#xff0c;仅指向与其声明时指定签名相匹配的函数。委托可以分为单播委托和多播委托&#xff0c;二者的区别在于是对单个…