Multiparty Cardinality Testing for Threshold Private Set-2021:解读
本文记录阅读该论文的笔记。
本文基于阈值加法同态加密方案提出了一个新的允许\(N\)方检查其输入集的交集是否大于\(n-t\)的IPSI方案,该协议的通信复杂度为\(O(Nt^2)\)。
注意:\(N\)指的是多少个参与方、\(n\)是输入集的大小、\(t\)是预先设定的阈值,也是阈值。
该方案基于The Communication Complexity of Threshold Private Set Intersection-2019:解读进行的改进。
该协议可以用于各方知道交集很大,但不知道具体多大时,可以使用!
摘要
(1)该协议的通信复杂度不依赖于输入集的大小,而取决于阈值\(t\)的大小
(2)基于阈值的PSI协议分为两部分:
- 交集的势测试(Cardinality Testing ),即测试参与方的交集是否大于\(n-t\)
- PSI:计算交集
介绍
两方阈值PSI:
(1)双方先检测交集大小是否\(> n-t\)
(2)若满足,则求交(获取交集);否则,什么也得不到(获取不到交集)
标准PSI和阈值PSI的对比:
- 标准的PSI更在乎交集,而不在乎交集的大小,而阈值PSI更关注交集的大小。
- 阈值PSI的通信量较少,只取决于阈值\(t\)的大小;标准的PSI通信量取决于输入集合的大小。
阈值PSI现状:
只有以下方案进行了讨论:
(1)【Privatepool: Privacy-preserving ridesharing-2017】
(2)【An algebraic approach to maliciously secure private set intersection-2019】
(3)【The communication complexity of threshold private set intersection-2019】
其中只有(3)的通信复杂度不依赖于\(n\),方案是两方场景。
(4)【Multi-party threshold private set intersection with sublinear communication-2021】
这也是一个多方阈值PSI,使用FHE,通信复杂度为\(O(Nt)\),也提出了一个TPKE加密方案实现了:只有当各方的交集足够大时,各方才能求交集。还可以秘密的计算汉克尔矩阵的行列式(矩阵大小的线性时间内)。
阈值PSI的应用:
(1)约会APP
(2)生物特征认证
(3)拼车【Privatepool: Privacy-preserving ridesharing 】
假设两个(或更多)方正在使用拼车应用程序,如果他们的路线有很大的交集,它允许他们共享车辆。然而由于隐私问题,他们不想公开他们的行程。阈值PSI可以解决该问题,各方可以联合执行一个阈值PSI协议,了解路线的交叉点,如果交叉点足够大,共享一辆车,否则,他们就不共享一辆车,也能保证用户的路线隐私。
阈值PSI
当前的阈值PSI主要分为两步:
(1)Cardinality Testing:就是各方检测交集是否大于\(n-t\)
(2)PSI:如果满足(1),则输出交集;否则没有输出
具体:
如果起始\(t=1\),则\(t\)的取值范围有:\(1,2,4,8,...,t,2t\)
通信复杂只取决于\(t\)的原因:
合适的阈值一定是2的次幂 ,如果交集大于\(n-t'\),则Cardinality Testing对于阈值\(t\)就成功,因为\(t\geq t'>t/2\),所以协议的通信复杂度只取决于阈值的大小。
解释有点牵强,或许我没理解
\(t'\)是什么?
贡献
(1)多方Cardinality Testing
- 较上面的Cardinality Testing,这里给出了满足多方的Cardinality Testing
- 通信复杂度为\(O(Nt^2)\)
- 并给出一些新的线性计算(linear algebra):求密文矩阵相乘、求密文矩阵的秩、求密文矩阵的逆等
该协议在【Secure linear algebra using linearly recurrent sequences-2007】【Communication efficient secure linear algebra-2006】的(两方)基础上构建的多方阈值PSI。
(2)多方阈值PSI
这里也是将一个两方的协议改为多方。
回顾一下两方的情况:
两方Alice和Bob各有数据\(S_A\)和\(S_B\),其大小都是\(n\),阈值\(t<<n\),如果\(|S_A\cap S_B|\geq n-t\),则求出交集\(S_A\cap S_B\)。
我们方案基于【The communication complexity of threshold private set intersection-2019】论文,这是一个两方的阈值PSI协议:
(1)若交集大于\(n-t\)
(2)计算交集
两方将数据编码到多项式中,得到\(P_A(x)=(x-a_i)...(x-a_n)\)和\(P_B=(x-b_1)...(x-b_n)\)在一个大的有限域上\(F\),其中\(a_i\in S_A,b_i\in S_B\),然后只要满足\(|S_A\cap S_B|\geq n-t\),则:
且\(deg(P_A)=deg(P_B)=t\),所以两方只需要在\(P_A(x)/P_B(x)=P_{A\setminus B}(x)/P_{B\setminus A}\)上计算\(O(t)\)个点。然后将这些点插值得到\(P_A(x)/P_B(x)\),然后求出分母\(P_{B\setminus A}\),继而求出交集多项式\(P_{A\setminus B}(x)=P_B(x)/P_{B\setminus A}\)
紧接上文问题:具体如何根据\(P_A(x)/P_B(x)\),然后求出分母\(P_{B\setminus A}\)?
Bob不能恢复出分子\(P_{A\setminus B}\),否则方案就不安全了,所以这里使用Oblivious Linear Evaluation (OLE)技术用于“掩盖”分子项(随机化)。
该协议只有满足\(|S_A\cap S_B|\geq n-t\),才是安全的,否则就会泄露额外的信息,所以双方应该先执行Cardinality Testing操作,来保证协议是满足\(|S_A\cap S_B|\geq n-t\)的。
扩展到多方的限制:
这里讲的是Cardinality Testing如何扩展为多方:
参与方先将数据编码到多项式中,得到\(Q_A(x)=x^{a_i}+...+x^{a_n}\)和\(Q_B=x^{b_1}+...+x^{b_n}\),其中\(a_i\in S_A,b_i\in S_B\),检测\(Q(x)=Q_A(x)-Q_B(x)\)是否是一个稀疏多项式(sparse polynomial),若是,则判断集合\((S_A \cup S_B)\setminus (S_A \cap S_B)\)是小集合(small),通信复杂度为\(O(t^2)\)。
那问题来了:
(1)如何判断多项式是否时稀疏的?
(2)如何判断集合是小的?
如果将其扩展为多方,对于\(N\)个参与者,有:\(\widetilde{Q}(x)=(N-1)Q_1(x)-Q_2(x)-...-Q_N(x)\),如果\(N\)很小的话,那该多项式\(\widetilde{Q}(x)\)就是稀疏的,那我们要是能计算该多项式的稀疏性,那么Cardinality Testing协议的总通信量变为\(O((Nt)^2)\)。
主要方法
1、安全线性代数(Secure Linear Algebra )
来源【Secure linear algebra using linearly recurrent sequences 】
有两个参与方,一方有矩阵的加密\(Enc(pk,M)\),另一方有对应的解密私钥\(sk\),他们想要对这个密文矩阵做运算(线性计算,linear algebra related ),比如:求逆矩阵的行列式、秩或者计算出\(x\),对于\(Mx=y\),给出加密的\(M,y\)。
我们可以将该问题扩展到方,对于N个参与者\(P_1,...,P_N\),每人有一份私钥的分享值,此外\(P_1\)有一个加密的矩阵,目的是要对这个加密的矩阵做运算(线性计算,linear algebra related)。
我们发现可以将【secure linear algebra】协议扩展为多方场景,通过使用具有加法同态性的阈值PKE代替具有加法同态的PKE和GC代替来实现,所以该方案允许N方在阈值PKE下解决这个线性代数问题\(Mx=y\)。
2、多方势检测(Cardinality Testing via Degree Test of a Rational Function )
对于参与方编码的多项式\(P_{S_i}(x)=(x-a_1^{(i)})...(x-a_n^{(i)}),i\in [1, N]\),有:
若交集\(\cap S_i\)大小大于\(n-t\),则\(deg(P_{S_1\setminus (\cap S_i)})=...=deg(P_{S_N\setminus (\cap S_i)})\leq t\)。
以上是求交的方法!
所以Cardinality Testing有以下问题:
对于有理函数\(f(x)=P_1(x)/P_2(x)\),能否安全的判断\(deg(P_1(x))=deg(P_2(x))\leq t\),进而通过插值\(O(t)\)个点得到\(f(x)\)?
我们发现,将\(V=(v_i,f(v_i))\)和\(W=(w_i,f(w_i))\)(\(2t\)个点值),插值为多项式\(f_V(x),f_W(x)\),满足:
另外,插值有理函数可以看作是求解线性方程组,所以通过前面介绍的“Secure Linear Algebra”,可以安全(不泄露额外信息)的计算“degree test”,换句话说,这能判断交集大小是否小于\(n-t\),同时不泄露额外信息。
3、多方计算交集
这里的方法可以看作是【The communication complexity of threshold private set intersection 】的推广。
各方将其数据进行编码为多项式\(P_{S_i}(x)=(x-a_1^{(i)})...(x-a_n^{(i)}),i\in [1, N]\),并且知道交集大小\(> n-t\),各方联合计算出有理函数\((P_{S_1}+...+P_{S_N})/P_{S_1}\),然后插值\(O(t)\)个点值,\(P_1\)方恢复出分母,求出交集。
该方案和【The communication complexity of threshold private set intersection】的不同之处就是,将“OLE calls”换成了基于阈值的PKE(具有加法同态性),可以看成多方OLE的替换。
4、安全性
在UC框架下证明了Cardinality Testing的安全,但还存在一个问题,就是“secure linear algebra”协议不能证明是UC安全的,因为输入是在公钥加密的密文,在UC设置中,输入是来自其他地方。
使用Externalized UC框架解决该问题,在该框架下,安全的“linear algebra ideal functionalities”共享公钥,每人一个私钥的分享份,使用这种方法证明协议的安全性。
由于“secure linear algebra”协议是安全的,如果它们都共享相同的公钥,那么在“Cardinality Testing”中,我们只需要创建此公钥并共享,所以我们可以证明“Cardinality Testing”是UC安全的。
其他的证明方式:仅证明住主协议的安全性,而不单独证明每个字协议的安全性。
推荐参考:UC安全,接下来需要看Externalized UC!
基础
\(S\)是一个有限集合,\(x\leftarrow S\)表示从\(S\)中随机采样,\(|S|\)表示\(S\)的势(cardinality);\(N\)个参与者;给出两个不可区分的分布\(D_1,D_2\);安全参数\(\lambda\)
阈值的PKE
主要介绍了密钥生成算法和判断是否为0的加密算法
UC框架和理想函数
方案使用UC框架【A new paradigm for cryptographic protocols】分析安全性,在该协议中,只考虑半诚实敌手。
其中:
- \(Z\)是环境
- \(\pi\)是协议
- \(A\)是真实世界
- \(F\)是理想函数
- \(SIM\)是模拟器
理想情况下的基于阈值的多方PSI:
只有当交集够大时,各方才会求交集。
Externalized UC of Global Setup:
externalized UC emulation (EUC)来源于【Universally composable security with global setup】,这是全局设置(global setup)的UC框架(简单版)
多项式插值
下面介绍使用一个随机多项式去“混淆/遮盖”一个级数小于t的多项式:
这种方式也可以用于多个多项式(多方),只要他们不共享一个因子(common factor)。
什么意思,不能约么?
下面介绍如何通过插值恢复出这个有理函数\(f(x)=P(x)/Q(x)\)以及证明该函数是唯一的
其中\(P(x)\)的级数为\(m\),\(Q(x)\)的级数为\(n\),则\(f(x)\)可一通过插值\(m+n+1\)个点唯一的插值出\(f(x)\),若\(P(x),Q(x)\)是首一的(monic),则只需要\(m+n\)个点。
给定集合\(V=(x,y)\),大小为\(m_1+m_2+1\),可以根据这\(V\)个点唯一的插值出\(f(x)=P(x)/Q(x)\)。
引理
Oblivious Degree Test for Rational Functions
下面给出一个多方协议下求线性计算\(Mx=y\),通信复杂度为\(O(t^2k\lambda N)\)。
多方求线性函数(Oblivious Linear Algebra)
多方求加密矩阵乘
功能是:
具体实现如下:
(1)初始化:各方\(P_i\),共享公钥\(pk\),以及每方各有一份私钥分享份\(sk_i\)
(2)输入:\(P_1\)输入两个矩阵的加密\(Enc(pk,M_l),Enc(pk,M_r)\),其中\(M_l,M_r\in F^{t*t}\)
(3)输出:各方得到\(Enc(M_l*M_r)\)
其思想就是:$(a_1+a_2+a_3)(b_1+b_2+b_3)-a_2(b_1+b_2+b_3)-a_3(b_1+b_2+b_3)=a_1b_1 $
但存在一个问题:(以三方为例)
最后得到的\(e=Enc(M_l*M_r)+Enc(R_r^{(1)}*R_r^{(1)})+Enc(R_r^{(2)}*R_r^{(2)})+Enc(R_r^{(3)}*R_r^{(3)})\),因为在上面框红处,没有自乘!
多方求加密矩阵的秩
功能:
具体实现如下:
其中\(F_{OMM}\)表示的是以\(O(log t)批处理\)计算\(t\)次乘法
不太懂
多方求线性函数
思想是将问题约减为最小多项式。
\(M\)是一个非奇异矩阵(non-singular matrix),也叫做满秩矩阵。
\(M,x,y\)都是密文形式。
功能:
具体实现如下:
多方势检测(Oblivious Degree Test)
功能:判断多方的交集数量\(t'\)是否大于阈值\(t\),若满足,则输出1,否则输出0。
主要思想是:
在两个不同数据集上插值出有理函数,并检查两次实验的结果是否相同。
插值有理函数可以看作求解线性函数,因此可以使用“secure linear algebra”求解线性函数。
最后各方只需要安全的检查\(C_v^{(1)}C_w^{(2)}-C_w^{(1)}C_v^{(2)}=0\)是否成立!
给定有理函数\(P(x)/Q(x)\),其中\(P(x),Q(x)\)有相同的级数,并给定两个集合\(V_1,V_2\),下面的协议\(secDT\)是判断这个有理数函数的级数是否小于阈值\(t\):
下面具体来分析一波:
(1)初始化
- 各方共享公钥\(pk\),且每人有一个私钥份\(sk_i\);
- 假设各方可以正常执行理想函数:\(F_{ORank},F_{OLS},F_{OMM},F_{DecZero}\);
- 各方共享一组随机数\((\alpha_1,...,\alpha_{4t+2}\);
(2)参与方\(P_1\)输入
输入:\(((\alpha_1,Enc(pk,f_1)),...,(\alpha_{4t+2},Enc(pk,f_{4t+2})))\),其中\(f_i=P_1(\alpha_i)/P_2(\alpha_i)\),\(P_1(x),P_2(x)\)是两个级数为\(t'\)的多项式
(3)\(P_1\)设置
将\(P_1\)的输入\(((\alpha_1,Enc(pk,f_1)),...,(\alpha_{4t+2},Enc(pk,f_{4t+2})))\)拆分为两部分\((\alpha_j,Enc(pk,f_j))_{j\in [2t+1]}=(v_j,Enc(pk,f_{v,j})))_{j\in [2t+1]}\)和\((\alpha_j,Enc(pk,f_j))_{j\in (2t+2,...,4t+2)}=(w_j,Enc(pk,f_{w,j})))_{j\in [2t+1]}\)。
所以得到了\(4t+2\)对点值\((v_j,Enc(pk,f_{v,j})_{j\in [2t+1]}\)和\((w_j,Enc(pk,f_{w,j})_{j\in [2t+1]}\)。
由上面的点值构造两个密态线性系统:
其中\(r=(v,w)\),\(M_r\)是一个维数为\(2t+1\)的方阵,\(y_r\)是一个长度为\(2t+1\)的向量。
这样就得到了加密的\(M_v,y_v\)和\(M_w,y_w\)。
(4)各方联合计算
计算:\(Enc(pk,rank(M_r)-rank([M_r || y]))\),如果结果不为0,则停止协议,其中使用了两次\(F_{ORank}\)和\(F_{DecZero}\)。
即参与方联合测试\(Enc(pk,rank(M_v)-rank([M_v || y_v]))\)和\(Enc(pk,rank(M_w)-rank([M_w || y_w]))\)解密后是否为0,若为0,则继续。
(5)各方联合计算
利用\(F_{OLS}\)计算上面的两个线性函数,每方得到\(Enc(pk,(c_v^{(1)}||c_v^{(2)}))\)和\(Enc(pk,(c_w^{(1)}||c_w^{(2)}))\),其中\(M_r[c_r^{(1)},c_r^{(2)}]=y_r,r\in(v,w)\);\(c_r^{(1)}\)和\(c_r^{(2)}\)各是长度为\(t+1\)和\(t\)的向量。
这时各方能根据\(M_r[c_r^{(1)},c_r^{(2)}]=y_r,r\in(v,w)\)由\((y_v,M_v)\)得到密态的\(c_v^{(1)}||c_v^{(2)}\),\((y_w,M_w)\)得到密态的\(c_w^{(1)}||c_w^{(2)}\)。
(6)各方联合计算
计算出:\(C_v^{(1)}(x)=\sum_{j=0}^{t}c_{v,j}^{(1)}x^{t-j}\),\(C_v^{(2)}(x)=x^t+\sum_{j=0}^{t}c_{v,j-1}^{(2)}x^{t-j}\)和\(C_w^{(1)}(x)=\sum_{j=0}^{t}c_{w,j}^{(1)}x^{t-j}\),\(C_w^{(2)}(x)=x^t+\sum_{j=0}^{t}c_{w,j-1}^{(2)}x^{t-j}\)
最终计算出密态的\(z\)。
(7)判断
各方使用\(F_{DecZero}\)检查\(z\)是否等于0(即对\(z\)解密)。如果是,输出0;如果不是,输出1。
优化
我们考虑在对插值生成\(f(x)=P(x)/Q(x)\),当\(Q(\alpha_i)=P(\alpha_i)=0\)时,我们就不能求\(f(x)\)了。
解决办法就是,去掉该点:
使得\(\widetilde{P}(x)=P(x)/(x-\alpha _i),\widetilde{Q}(x)=Q(x)/(x-\alpha _i),f(\alpha _i)=\widetilde{P}(\alpha _i)/\widetilde{Q}(\alpha _i)\)
具体来讲,就是计算出点值对\((\alpha _i,Enc(pk,P_1(\alpha _i)/(x-\alpha _i))\),\((\alpha _i,Enc(pk,P_2(\alpha _i)/(x-\alpha _i)))\)。
这里的\(P_1(),P_2(X)\)指的是\(P(x),Q(x)\)
然后再分别构造出\(Enc(pk,M_r),Enc(pk,y_r)\),后面的不变。
另外协议也能推广到\(deg(P(x))\neq deg(Q(x))\)的情况。
多方阈值PSI
该协议的重点就是cardinality test protocol,能够安全的判断N方数据的交集和阈值的大小关系。
安全的势检测(Secure Cardinality Testing)
1、理想功能
2、具体实现
总结一下:
(1)各方先各自将数据编码为多项式,然后求出\(4t+2\)个点值,加密这些点,得到\(4t+2\)个密态值\(Enc(pk,r_i*P_i(\alpha_j))\),广播出去。
(2)\(P_1\)得到\(4t+2\)个\(c_i^{(j)}\),计算得到\(d^{(j)}\),形成密态点值对\((\alpha_j,d^{(j)})\),并和私钥\(sk_1\)一起发送给理想函数\(F_{SDT}\)。
(3)其他参与方\(P_2,...,P_N\)也将各自的私钥\(sk_i\)发送给理想函数\(F_{SDT}\),从而判断分子\(P_1(x)\)和分母\(P_2(x)\)的级数是否最大为\(t\),然后输出结果。
完整的多方阈值PSI协议
在该协议中,通过使用TPKE扩展了之前的方案,具体协议如下:
总结一下:
(1)各方先将数据发送给理想函数\(F_{MPCT}\),检测交集大小和阈值的大小关系。
(2)再通过理想函数\(F_{Gen}\)生成密钥:各方共享公钥\(pk\),各自有一个私钥份\(sk_i\)。
(3)各方执行:
- 将数据\(S_i\)编码为多项式\(P_i(x)\),计算出\(3t+_1\)个点值\(P_i(\alpha_j)\)。
- 采样\(R_i(x)\),使得\(deg(R_i(x))=t\)。
- 加密:\(c_i^{(j)}=Enc(pk,R_i(\alpha_j)*P_i(\alpha_j))\),然后广播出去。
(4)\(P_1\)将收到的对应的密文相加得到\(3t+1\)个值\(d^{(j)}=\sum_{i}^{N}c_i^{(j)}\),再将其广播出去。
(5)联合解密出\(V^{(j)}=Dec(sk,d^{(j)})\)。
(6)\(P_1\)计算点\(\widetilde{V}^{(j)}=V^{(j)}/P_1(\alpha_j)\),得到点值对\((\alpha_j,\widetilde{V}^{(j)})\),将其插值出函数\(\widetilde{V}^{(j)}(x)\),再恢复出分母\(P_{S_1\setminus (\cap S_i )}(x)\)。
(7)\(P_1\)根据自己数据\(S_1=(a_1^{(1)},...,a_1^{(n)})\)计算出\(P_{S_1\setminus (\cap S_i )}(a_1^{(j)})\),根据\(P_{S_1\setminus (\cap S_i )}(a_1^{(j)})\neq 0\),判断\(a_1^{(j)}\)是否在交集中。
(8)广播交集。
在这里给出了详细如何根据\(P_{S_1\setminus (\cap S_i )}(x)\),计算出交集!
正确性证明:
这样就能根据\(3t+1\)个点插值出\(\widetilde{V}^{(j)}(x)\),再“恢复”出分母\(P_{S_1\setminus (\cap S_i )}(x)\),进而带入数据元素判断是否为交集元素。
总结
1、关键点“cardinality test protocol”,也是最难理解的
2、如何根据\(f(x)\)恢复出分母?
Multiparty Cardinality Testing for Threshold Private Set-2021:解读的更多相关文章
- Multi-Party Threshold Private Set Intersection with Sublinear Communication-2021:解读
记录阅读论文的笔记. 摘要 总结: (1)CRYPTO 2019:The Communication Complexity of Threshold Private Set Intersection- ...
- A Unified Deep Model of Learning from both Data and Queries for Cardinality Estimation 论文解读(SIGMOD 2021)
A Unified Deep Model of Learning from both Data and Queries for Cardinality Estimation 论文解读(SIGMOD 2 ...
- java中的Collection集合类
随着1998年JDK 1.2的发布,同时新增了常用的Collections集合类,包含了Collection和Map接口.而Dictionary类是在1996年JDK 1.0发布时就已经有了.它们都可 ...
- Vue2.5 Web App 项目搭建 (TypeScript版)
参考了几位同行的Blogs和StackOverflow上的许多问答,在原来的ng1加TypeScript以及Webpack的经验基础上,搭建了该项目,核心文件如下,供需要的人参考. package.j ...
- 阈值PSI代码
阈值PSI 若交集数量超过某个给定阈值时,允许分布式的各个参与方在自己集合中找到交集,且除了交集外,得不到其他额外信息. 实现论文: Multi-Party Threshold Private Set ...
- Android 剪贴板详解
版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Clipboard 如本文有助于你理解 Android 剪贴板,不妨给我一个 Star.对于码农而言, ...
- iOS编码规范
The official raywenderlich.com Objective-C style guide. This style guide outlines the coding con ...
- Visual Studio EventHandler Delegate 和 EventArgs
EventHandler代理 用来表示处理一个没有事件数据(event data)的事件(event)的 方法. 无论何时事件发生时,事件代理就被调用来触发以前事件驱动的其他事件(监听当前事件TCur ...
- 【leetcode】两数之和
https://leetcode.com/problems/two-sum/ Example: Given nums = [2, 7, 11, 15], target = 9, Because num ...
随机推荐
- Dom基础(三):事件冒泡,事件委托(事件代理)和事件捕获
javascript中的addEventListener(事件名,回调,布尔) 其中第三个参数默认为false-事件冒泡,true为事件捕获 二者区别: 事件冒泡:目标元素事件先触发,然后父元素事件触 ...
- 还在用em strong吗?快来试试 text-emphasis
大家好,我是半夏,一个刚刚开始写文的沙雕程序员.如果喜欢我的文章,可以关注 点赞 加我微信:frontendpicker,一起学习交流前端,成为更优秀的工程师-关注公众号:搞前端的半夏,了解更多前端知 ...
- 甲骨文严查Java授权,换openJDK要避坑
背景 外媒The Register报道,甲骨文稽查企业用户,近期开始将把过去看管较松散的Java授权加入. 甲骨文针对标准版Java(Java SE)有2种商业授权.2019年4月甲骨文宣布Java ...
- 『现学现忘』Git基础 — 20、Git中忽略文件补充
目录 1.忽略文件常遇到的问题 2.忽略文件配置优先级 3.忽略已跟踪文件的改动(本机使用) 4.autocrlf和safecrlf参数说明 (1)提出问题 (2)autocrlf说明 (3)safe ...
- php魔术方法小结
php魔术方法 __construct() __construct(mixed ...$values = ""): void PHP 允许开发者在一个类中定义一个方法作为构造函数. ...
- 219. Contains Duplicate II - LeetCode
Question 219. Contains Duplicate II Solution 题目大意:数组中两个相同元素的坐标之差小于给定的k,返回true,否则返回false 思路:用一个map记录每 ...
- 455. Assign Cookies - LeetCode
Question 455. Assign Cookies Solution 题目大意:数组g的大小表示有几个小孩,每个元素表示小孩的食量,数组s的大小表示有多少个饼干,每个元素的大小表示每个饼干的大小 ...
- Spark框架——WordCount案例实现
package wordcount import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} ...
- dpkg-DEB包管理器
dpkg是Deb系列发行版操作系统下.deb软件包管理器. 语法 dpkg [option] [package] 选项 -i 安装Deb软件包. -r 删除Deb软件包. -P 删除Deb软件包的同时 ...
- 《C Primer Plus》第六版笔记--7~10章
目录 第七章 C控制语句:分支和跳转 第八章 字符输入/输出和输入验证 第九章 函数 第十章 数组和指针 第七章 C控制语句:分支和跳转 if else 用法 if (expression) //ex ...