满足Local Differential Privacy(LDP)的五种编码的介绍

2 篇文章 0 订阅
1 篇文章 0 订阅


Local Differential Privacy(LDP)可以在收集用户的敏感数据时,保护用户的隐私信息。神奇的LDP,定义是任意两个输入 v 1 , v 2 v_1,v_2 v1,v2输出同一个值 y y y的概率的比值在 e ε e^\varepsilon eε界里 :

如果一个算法 A A A满足 ε \varepsilon ε-local differential privacy( ε \varepsilon ε-LDP),其中 ε ≥ 0 \varepsilon\geq0 ε0,当且仅当对于任意的输入 v 1 , v 2 v_1,v_2 v1,v2,有
∀ y ∈ R a n g e ( A ) : P r [ A ( v 1 ) = y ] ≤ e ε P r [ A ( v 2 ) = y ] , \forall y\in Range(A): Pr[A(v_1)=y]\leq e^{\varepsilon}Pr[A(v_2)=y], yRange(A):Pr[A(v1)=y]eεPr[A(v2)=y],
其中 R a n g e ( A ) Range(A) Range(A)表示算法 A A A的所有可能输出的值。

LDP的基本应用是频度估计(即,从n个数据里,统计每个值的出现次数),它可以归结为下面的3个步骤:

  1. Encode即编码,由每个用户执行:
    – 输入一个值 v v v;输出一个编码后的值 x x x,即 x = E n c o d e ( v ) x=Encode(v) x=Encode(v)
  2. Perturb即扰动,由每个用户执行:
    – 输入一个编码后的值 x x x,输出扰动后的值 y y y,即 y = P e r t u r b ( x ) = P e r t u r b ( E n c o d e ( v ) ) y=Perturb(x)=Perturb(Encode(v)) y=Perturb(x)=Perturb(Encode(v)),后面简记为 y = P E ( v ) y=PE(v) y=PE(v)
  3. Aggregate即收集,由收集者(Aggregator)执行:
    – 将所有用户扰动后的值 y y y收集,输出处理后的信息,如频度估计。
    在这里插入图片描述
    本文将介绍17-USENIX-Locally Differentially private Protocols for Frequency Estimation1中所描述的满足LDP的五种编码方法,对它们的比较主要是两个指标:
  4. 隐私保护程度 ε \varepsilon ε
  5. 频度估计(frequency estimation)的方差 V a r ( c ~ ( i ) ) Var(\tilde{c}(i)) Var(c~(i))

1. Basic RAPPOR 简化版

规定输入 v v v的值是有限的,为 d d d个。不失一般性,我们 v v v 1 1 1 d d d的整数,即 v ∈ [ 1 , d ] , v ∈ N v\in[1, d],v\in N v[1,d],vN

  1. Encoding: 将输入的整数转化成长度为 d d d 的01串,对应位取 1 1 1,其余位取 0 0 0,即 E n c o d e ( v ) = B 0 Encode(v)=B_0 Encode(v)=B0,其中 B 0 B_0 B0是长度为 d d d的01串,并保证 B 0 [ v ] = 1 , B 0 [ i ] = 0 , i ≠ v B_0[v]=1,B_0[i]=0, i\neq v B0[v]=1,B0[i]=0,i=v。如 d = 5 , v = 3 d=5, v=3 d=5,v=3,则 B 0 = 00100 B_0=00100 B0=00100;
  2. Perturbing: (Rapper是有两次扰动的,此处简化仅考虑一次)01串 B 0 B_0 B0的每一位分别以 p p p(一般来说, p ≥ 1 2 p\geq \frac{1}{2} p21)的概率保持,以 q = 1 − p q=1-p q=1p的概率反转,产生扰动后的01串 B 1 B_1 B1,即:
    P r [ B 1 [ i ] = 1 ] = { p , i f B 0 [ i ] = 1 , q = 1 − p , i f B 0 [ i ] = 0. Pr[B_1[i]=1]=\left\{ \begin{array}{cr} p, &if B_0[i]=1, \\ q=1-p, &if B_0[i]=0. \end{array} \right. Pr[B1[i]=1]={p,q=1p,ifB0[i]=1,ifB0[i]=0.
  3. Aggregation: 收集者可以收集到所有用户(设有n个)扰动后的01串 B 1 B_1 B1,按位估计出原始的个数。记第 i i i位为 1 1 1的用户个数为 c ( i ) c(i) c(i),依此可以估计出扰动前 B 0 B_0 B0中第 i i i位为 1 1 1的用户个数 c ~ ( i ) \tilde{c}(i) c~(i),扰动前的第 i i i 位为 1 1 1的有 p p p的概率保持,为 0 0 0的有 q = 1 − p q=1-p q=1p的概率反转:
      p ⋅ c ~ ( i ) + q ⋅ ( n − c ~ ( i ) ) = c ( i ) ⇒   p ⋅ c ~ ( i ) + ( 1 − p ) ⋅ ( n − c ~ ( i ) ) = c ( i ) ⇒   c ~ ( i ) = c ( i ) − ( 1 − p ) ⋅ n 2 p − 1 . \begin{aligned} &\ p\cdot\tilde{c}(i)+q\cdot(n-\tilde{c}(i))=c(i) \\ \Rightarrow&\ p\cdot\tilde{c}(i)+(1-p)\cdot(n-\tilde{c}(i))=c(i) \\ \Rightarrow&\ \tilde{c}(i)=\frac{c(i)-(1-p)\cdot n}{2p-1}. \end{aligned}  pc~(i)+q(nc~(i))=c(i) pc~(i)+(1p)(nc~(i))=c(i) c~(i)=2p1c(i)(1p)n.

p p p是事先约定的, n n n是收集者收集到的用户个数, c ( i ) c(i) c(i)可以根据收集到的数据累加出来,因此可以比较方便地计算出 c ~ ( i ) \tilde{c}(i) c~(i)

Privacy: 要达到 ε \varepsilon ε-LDP,可以取 ε = ln ⁡ ( ( p 1 − p ) 2 ) \varepsilon=\ln((\frac{p}{1-p})^2) ε=ln((1pp)2),证明见2014-Rappor2

2. Direct Encoding(DE)

依然规定输入 v v v的值是有限的,为 d d d个。

  1. Encoding: 正如其名,输入的整数编码成自身,即 E n c o d e ( v ) = v Encode(v)=v Encode(v)=v;
  2. Perturbing: 依然概率 p p p表示 v v v扰动后得到自身 v v v,概率 q = 1 − p d − 1 q=\frac{1-p}{d-1} q=d11p表示其他值(剩下的 d − 1 d-1 d1个值)扰动后得到 v v v。为了满足LDP的定义,有 p = e ε q p= e^{\varepsilon}q p=eεq,可得到:
    P r [ P e r t u r b D E ( x ) = i ] = { p = e ε e ε + d − 1 , i f i = x , q = 1 e ε + d − 1 , i f i ≠ x . Pr[Perturb_{DE}(x)=i]=\left\{ \begin{array}{cr} p=\frac{e^{\varepsilon}}{e^{\varepsilon}+d-1}, &if i=x, \\ q=\frac{1}{e^{\varepsilon}+d-1}, &if i\neq x. \end{array} \right. Pr[PerturbDE(x)=i]={p=eε+d1eε,q=eε+d11,ifi=x,ifi=x.
  3. Aggregation: 收集者可以收集到所有用户(设有n个)扰动后的值 v ′ v' v,按值估计出每个值个数。类似地,记扰动后值为 i i i的用户个数为 c ( i ) c(i) c(i),依此可以估计出扰动前值为 i i i的用户个数 c ~ ( i ) \tilde{c}(i) c~(i),扰动前的值为 i i i的有 p p p的概率保持,非 i i i的有 q = 1 − p d − 1 q=\frac{1-p}{d-1} q=d11p的概率反转:
      p ⋅ c ~ ( i ) + q ⋅ ( n − c ~ ( i ) ) = c ( i ) ⇒   c ~ ( i ) = c ( i ) − q ⋅ n p − q ⇒   c ~ ( i ) = c ( i ) ⋅ ( e ε + d − 1 ) − n e ε − 1 , \begin{aligned} &\ p\cdot\tilde{c}(i)+q\cdot(n-\tilde{c}(i))=c(i) \\ \Rightarrow &\ \tilde{c}(i)=\frac{c(i)-q\cdot n}{p-q} \\ \Rightarrow &\ \tilde{c}(i)=\frac{c(i)\cdot(e^{\varepsilon}+d-1)-n}{e^{\varepsilon}-1}, \end{aligned}  pc~(i)+q(nc~(i))=c(i) c~(i)=pqc(i)qn c~(i)=eε1c(i)(eε+d1)n,
    以及方差1
    V a r [ c ~ D E ( i ) ] = n ⋅ d − 2 + e ε ( e ε − 1 ) 2 . Var[\tilde{c}_{DE}(i)]=n\cdot \frac{d-2+e^{\varepsilon}}{(e^{\varepsilon}-1)^2}. Var[c~DE(i)]=n(eε1)2d2+eε.

3. Histogram Encoding(HE)

依然规定输入 v v v的值是有限的,为 d d d个。编码方式和Basic RAPPOR简化版类似,不过由整数变成了实数,扰动的时候加Laplace噪声。

  1. Encoding: *将输入的整数转化成长度为 d d d 的01串,对应位取 1.0 1.0 1.0,其余位取 0.0 0.0 0.0,即 E n c o d e H E ( v ) = [ 0.0 , 0.0 , . . . , 1.0 , . . . , 0.0 ] Encode_{HE}(v)=[0.0, 0.0, ..., 1.0, ..., 0.0] EncodeHE(v)=[0.0,0.0,...,1.0,...,0.0];
  2. Perturbing: P e r t u r b H E ( B ) Perturb_{HE}(B) PerturbHE(B)输出 B ′ [ i ] = B [ i ] + L a p ( 2 ε ) B'[i]=B[i]+Lap(\frac{2}{\varepsilon}) B[i]=B[i]+Lap(ε2);
  3. Aggregation: 有两类,分别为SHE, THE,如下:

3.1 Summation with Histogram Encoding(SHE)

Aggregate是求和, c ~ ( i ) = ∑ j B j [ i ] \tilde{c}(i)=\sum_{j}B^{j}[i] c~(i)=jBj[i] j j j表示第 j j j个用户。
因为 L a p ( 2 ϵ ) Lap(\frac{2}{\epsilon}) Lap(ϵ2)是无偏的(均值为 0 0 0),所以这种方式也是无偏的;
对应的方差1
V a r [ c ~ S H E ( i ) ] = n 8 ε 2 . Var[\tilde{c}_{SHE}(i)]=n\frac{8}{\varepsilon^2}. Var[c~SHE(i)]=nε28.

3.2 Thresholding with Histogram Encoding(THE)

Aggregate是设定阈值 θ \theta θ,大于 θ \theta θ统计为 1 1 1,小于等于 θ \theta θ统计为 0 0 0。其实也很容易理解,Encoding时在对应数位 B [ v ] B[v] B[v] 1.0 1.0 1.0,如果增加的扰动不是太大,一般会大于某个数(取为 θ \theta θ);同时 B [ i ] B[i] B[i] 0.0 0.0 0.0,如果增加的扰动不是太大,一般会小于某个数(取为 θ \theta θ)。
此时,可取 p = 1 − F ( θ − 1 ) , q = 1 − F ( θ ) , p=1-F(\theta-1),q=1-F(\theta), p=1F(θ1),q=1F(θ),
其中 F ( x ) F(x) F(x)是Laplace分布的累积函数;
一般来说, θ ∈ [ 0 , 1 ] \theta\in[0,1] θ[0,1],此时有
p = 1 − 1 2 e ε 2 ( θ − 1 ) , q = 1 − 1 2 e − ε 2 θ , p=1-\frac{1}{2}e^{\frac{\varepsilon}{2}(\theta-1)},q=1-\frac{1}{2}e^{-\frac{\varepsilon}{2}\theta}, p=121e2ε(θ1),q=121e2εθ,
可得方差1:
V a r [ c ~ T H E ( i ) ] = n 2 e ε θ / 2 − 1 ( 1 + e ε ( θ − 1 / 2 ) − 2 e ϵ θ / 2 ) 2 . Var[\tilde{c}_{THE}(i)]=n\frac{2e^{\varepsilon\theta/2}-1}{(1+e^{\varepsilon(\theta-1/2)-2e^{\epsilon\theta/2}})^2}. Var[c~THE(i)]=n(1+eε(θ1/2)2eϵθ/2)22eεθ/21.

θ ∈ ( 1 2 , 1 ) \theta\in(\frac{1}{2},1) θ(21,1)时,THE能取到最优值;因为SHE统计时 B ′ [ i ] B'[i] B[i]是在整个实数域上的,而THE中统计时 B ′ [ i ] B'[i] B[i]只有 0 , 1 0,1 0,1二值,所以 V a r [ c ~ T H E ( i ) ] < V a r [ c ~ S H E ( i ) ] Var[\tilde{c}_{THE}(i)]<Var[\tilde{c}_{SHE}(i)] Var[c~THE(i)]<Var[c~SHE(i)]总是成立。

4. Unary Encoding(UE)

和Basic RAPPOR简化版非常相似,Encoding相同,Perturbing(扰动)的时候,概率 p p p表示数位不变,概率 q q q表示数位反转,仍有 p > q p>q p>q;这里和Basic RAPPOR简化版不同的地方是 p + q p+q p+q可以不为 1 1 1
为了保持 ε \varepsilon ε-LDP,仅需考虑 v 1 , v 2 v_1,v_2 v1,v2对应的数位(其他的都相同),最坏情况下, v 1 v1 v1不变, v 2 v2 v2反转,可得 ε = l n ( p ( 1 − q ) ( 1 − p ) q ) \varepsilon=ln(\frac{p(1-q)}{(1-p)q}) ε=ln((1p)qp(1q)),具体证明可看这里1

  1. Encoding: 将输入的整数转化成长度为 d d d 的01串,对应位取 1 1 1,其余位取 0 0 0,即 E n c o d e ( v ) = [ 0 , . . . , 0 , 1 , 0 , . . . , 0 ] Encode(v)=[0,...,0,1,0,...,0] Encode(v)=[0,...,0,1,0,...,0];
  2. Perturbing: 01串 B 0 B_0 B0的每一位分别以 p p p的概率保持,以 q q q( p + q ≠ 1 p+q\neq 1 p+q=1)的概率反转,产生扰动后的01串 B 1 B_1 B1,即:
    P r [ B 1 [ i ] = 1 ] = { p , i f B 0 [ i ] = 1 , q , i f B 0 [ i ] = 0. Pr[B_1[i]=1]=\left\{ \begin{array}{cr} p, &if B_0[i]=1, \\ q, &if B_0[i]=0. \end{array} \right. Pr[B1[i]=1]={p,q,ifB0[i]=1,ifB0[i]=0.
  3. Aggregation: 略。

方差为:
V a r [ c ~ U E ( i ) ] = n ⋅ ( ( e ε − 1 ) q + 1 ) 2 ( e ε − 1 ) 2 ( 1 − q ) q . Var[\tilde{c}_{UE}(i)]=n\cdot\frac{((e^{\varepsilon}-1)q+1)^2}{(e^{\varepsilon}-1)^2(1-q)q}. Var[c~UE(i)]=n(eε1)2(1q)q((eε1)q+1)2.

4.1 Symmetric Unary Encoding(SUE)

p + q = 1 p+q=1 p+q=1,此时
p = e ε / 2 e ε / 2 + 1 , q = 1 e ε / 2 + 1 , p=\frac{e^{\varepsilon/2}}{e^{\varepsilon/2}+1},q=\frac{1}{e^{\varepsilon/2}+1}, p=eε/2+1eε/2,q=eε/2+11,
方差为
V a r [ c ~ S U E ( i ) ] = n ⋅ e ε / 2 ( e ε / 2 − 1 ) 2 . Var[\tilde{c}_{SUE}(i)]=n\cdot\frac{e^{\varepsilon/2}}{(e^{\varepsilon/2}-1)^2}. Var[c~SUE(i)]=n(eε/21)2eε/2.

4.2 Optimized Unary Encoding(OUE)

由UE的方差,对 q q q求偏导等于 0 0 0,可得
p = 1 2 , q = 1 e ε / 2 + 1 , p=\frac{1}{2},q=\frac{1}{e^{\varepsilon/2}+1}, p=21,q=eε/2+11,
论文中对 p , q p,q p,q取值的含义介绍的很不错, p p p只要对总共只有一个的 1 1 1扰动,而 q q q要对有 d − 1 d-1 d1个的 0 0 0进行扰动,因此会对 0 0 0取较大的隐私预算。
此时的方差为
V a r [ c ~ O U E ( i ) ] = n ⋅ 4 e ε ( e ε − 1 ) 2 . Var[\tilde{c}_{OUE}(i)]=n\cdot\frac{4e^{\varepsilon}}{(e^{\varepsilon}-1)^2}. Var[c~OUE(i)]=n(eε1)24eε.

5. Local Hashing(LH)

需要先了解一下universal hashing,可以参考我写的博客。其他参考资料有Sarah Adel Bargal的介绍3,用数学的角度来介绍,非常简洁也很清楚;另外wikipedia的universal hashing4,用历史的角度来介绍。

universal hashing的基本思想5:一个hash函数 y = h ( x ) y=h(x) y=h(x)总是能够针对性地造一组样例,使得hash映射的结果很差很差;一种解决办法(universal hashing)是,我们用一组hash函数(a family of hash functions),每次从中随机选择一个函数作一次映射,平均意义下任意两个不同的输入 x 1 , x 2 x_1,x_2 x1,x2的hash函数相同的概率不超过 1 g \frac{1}{g} g1 g g g是hash table的大小。

Binary Local Hashing(BLH)

如果我们选择值域 g = 2 g=2 g=2,输出为 0 , 1 0,1 0,1两种(Binary)。

  1. Encoding: 随机均匀地从 H \mathbb{H} H(universal hash function family)选择一个hash函数 H H H,映射输入 v v v,输出hash函数和结果,得 E n c o d e B L H ( v ) = < H , b = H ( v ) > Encode_{BLH}(v)=<H,b=H(v)> EncodeBLH(v)=<H,b=H(v)>;
  2. Perturbing: 仅对结果 b b b扰动, P e r t u r b B L H ( < H , b > ) = < H , b ′ > Perturb_{BLH}(<H,b>)=<H,b'> PerturbBLH(<H,b>)=<H,b>,其中
    P r [ b ′ ] = { p = e ε e ε + 1 , i f   b = 1 , q = 1 e ε + 1 , i f   b = 0. Pr[b']=\left\{ \begin{array}{cr} p=\frac{e^{\varepsilon}}{e^{\varepsilon}+1}, &if\ b=1, \\ q=\frac{1}{e^{\varepsilon}+1}, &if\ b=0. \end{array} \right. Pr[b]={p=eε+1eε,q=eε+11,if b=1,if b=0.
  3. Aggregation: 结合Encoding和Perturbing,可得
    p ∗ = p , q ∗ = 1 2 , p*=p,q*=\frac{1}{2}, p=p,q=21,
    因此,方差为
    V a r [ c ~ B L H ( i ) ] = n ⋅ ( e ε + 1 ) 2 ( e ε − 1 ) 2 . Var[\tilde{c}_{BLH}(i)]=n\cdot\frac{(e^{\varepsilon}+1)^2}{(e^{\varepsilon}-1)^2}. Var[c~BLH(i)]=n(eε1)2(eε+1)2.

Optimized Local Hashing(OLH)

考虑到值域 g = 2 g=2 g=2,很容易丢失信息,因此会选择 g ≥ 2 g\geq 2 g2,同时 g g g如果太大的话,也会丢失掉信息。先假设值域为 g g g,则

  1. Encoding: 随机均匀地从 H \mathbb{H} H选择一个hash函数 H H H,映射输入 v v v,输出hash函数和结果,得 E n c o d e B L H ( v ) = < H , x = H ( v ) > Encode_{BLH}(v)=<H,x=H(v)> EncodeBLH(v)=<H,x=H(v)>;
  2. Perturbing: 仅对结果 b b b扰动, P e r t u r b B L H ( < H , x > ) = < H , y > Perturb_{BLH}(<H,x>)=<H,y> PerturbBLH(<H,x>)=<H,y>,其中
    ∀ i ∈ [ g ] P r [ y = i ] = { p = e ε e ε + g − 1 , i f   x = i , q = 1 e ε + g − 1 , i f   x ≠ i . _{\forall i\in[g]}Pr[y=i]=\left\{ \begin{array}{cr} p=\frac{e^{\varepsilon}}{e^{\varepsilon}+g-1}, &if\ x=i, \\ q=\frac{1}{e^{\varepsilon}+g-1}, &if\ x\neq i. \end{array} \right. i[g]Pr[y=i]={p=eε+g1eε,q=eε+g11,if x=i,if x=i.
  3. Aggregation: 结合Encoding和Perturbing,可得
    p ∗ = p , q ∗ = 1 g p + g − 1 g q = 1 g , p*=p,q*=\frac{1}{g}p+\frac{g-1}{g}q=\frac{1}{g}, p=p,q=g1p+gg1q=g1,
    因此,方差为
    V a r [ c ~ L P ( i ) ] = n ⋅ ( e ε + g − 1 ) 2 ( e ε − 1 ) 2 ( g − 1 ) , Var[\tilde{c}_{LP}(i)]=n\cdot\frac{(e^{\varepsilon}+g-1)^2}{(e^{\varepsilon}-1)^2(g-1)}, Var[c~LP(i)]=n(eε1)2(g1)(eε+g1)2,
    方差对 g g g求偏导等于 0 0 0,可得 g = e ε + 1 g=e^{\varepsilon}+1 g=eε+1,此时 p ∗ = e ε e ε + g − 1 = 1 2 , q ∗ = 1 g = 1 e ε + 1 p*=\frac{e^{\varepsilon}}{e^{\varepsilon}+g-1}=\frac{1}{2},q*=\frac{1}{g}=\frac{1}{e^{\varepsilon}+1} p=eε+g1eε=21,q=g1=eε+11,所以
    方差为
    V a r [ c ~ O L H ( i ) ] = n ⋅ 4 e ε ( e ε − 1 ) 2 , Var[\tilde{c}_{OLH}(i)]=n\cdot\frac{4e^{\varepsilon}}{(e^{\varepsilon}-1)^2}, Var[c~OLH(i)]=n(eε1)24eε
    可以发现OUE和OLH的方差是一样的!非常神奇。

写这篇时,部分参考6。第一次写论文相关的,内容比较多、杂,如果大家有什么不懂的,可以随时私信哦。


  1. https://www.usenix.org/system/files/conference/usenixsecurity17/sec17-wang-tianhao.pdf ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  2. https://arxiv.org/abs/1407.6981 ↩︎

  3. https://download.csdn.net/download/MustImproved/12275636 ↩︎

  4. universal hashing ↩︎

  5. https://blog.csdn.net/MustImproved/article/details/105226276 ↩︎

  6. https://zhuanlan.zhihu.com/p/75666425 ↩︎

  • 9
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
局部差分隐私的操纵攻击是指攻击者试图影响隐私保护机制以获取敏感信息的行为。该攻击针对局部差分隐私机制的特性和缺点进行利用,以窃取隐私数据或干扰数据发布的结果。 局部差分隐私的目标是在保护个体隐私的前提下,提供对于整体数据集的有意义的分析结果。然而,攻击者可通过操纵自己的个体数据或其他数据的投入,来影响数据分析结果。例如,攻击者可能故意修改或篡改自己的数据,以改变数据发布的结论,或者通过协作或串通他人进行攻击。 操纵攻击的目的是干扰数据发布的结果,以推断出更多的隐私信息或获得误导性的数据分析结果。攻击者可能通过加入虚假的数据或者删除真实的数据来扰乱数据集的特性,使得发布的结果偏离真实情况。这种攻击可能会导致分析人员得出错误的结论或泄露隐私信息。 对抗局部差分隐私操纵攻击的方法包括对数据进行更严格的验证和校验、采用更复杂的算法进行数据发布,以及增加对攻击行为的监测和检测。此外,用户和数据发布者在数据分享和数据发布过程中需要保持警惕,增强对潜在攻击的认识和防范意识。 总之,局部差分隐私的操纵攻击是一种针对隐私保护机制的攻击行为,可通过操纵个体数据或其他数据的投入来干扰数据发布的结果。为了应对这种攻击,需要采取相应的安全措施和对攻击行为进行检测和防范。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值