【密码学】全同态加密基于多项式环计算的图解

全同态加密方案提供了一种惊人的能力 —— 能够在不知道数据具体内容的情况下对数据进行计算。这使得你可以在保持潜在敏感源数据私密的同时,得出问题的答案。

  

这篇文章的整体结构包括多项式环相关的数学介绍,基于多项式环的加密和解密是如何工作的,同态加法和乘法如何实现的。

原文来源:https://humanata.com/blog/illustrated_primer/#homomorphic-operations,现在已经无法访问。

前言        

        这些全同态加密方案【BFV、BGV、CKKS】都是基于一个称为Ring learning with errors(RLWE)的困难计算问题。

        本质上,这些方案中的数据在加密时(密文)和未加密时(明文)都用多项式表示。如: 4x^2 + 2x + 1

        与我们常学的多项式有一些不同,首先系数都是整数,余数是相对于某个整数 t 的余数(对 t 取模)。假设 t=24 ,那么一个24小时的时钟,21加6小时得到3小时。所有多项式的系数都是这样处理的。

        另外,我们可以将数字的取值范围设为-11到12,以便方便地对数字求反。请注意,这只是一个方便因素—— −1 的余数和23的余数(除以24)没有区别。

        第二个,也是比较棘手的,这些多项式的不同之处是使用余数的想法不仅适用于多项式的系数,也适用于多项式本身。

        我们定义了一个特殊的多项式,称为多项式模,并且只考虑多项式被该多项式模除后的余数。在BFV方案中,这个多项式模的具体形式是 x^d+1 ,其中 d=2^n 。对于一些 ,为了说明问题,我们取 n =4 ,因此多项式为 x^d+1

        因为我们考虑的是关于 x^d+1 的余项,所以我们只需要考虑幂次为 x^0x^{15}的多项式。任何较大的幂都会被多项式模除掉。这也可以通过考虑x^{16} \equiv -1\ (mod\ x^{16}+1)来理解,这意味着x^{16}可以用 −1 代替,以将 x 的较大幂次减少到0到15的范围内。

        我们考虑的所有多项式都是这种形式: 

        其中16个系数 a_i 可以从0到 t−1 。可以用一个由系数组成的环面来说明这一点,如下所示:

        在这个图中,每个环,代表多项式中出现的 的一个幂的24个系数的可能值。绿色的点表示系数0的位置。这为我们提供了一种很好的方式来可视化多项式,这将有助于我们在下面考虑加密和解密步骤的工作原理。

        BFV加密方案涉及大量的多项式乘法运算。当我们将x的两个幂相乘时,例如 2x^{14}x^4 ,我们将它们的指数相加——得到2x^{18} 。有人可能会假设,要找到关于多项式模的多项式余数,可能只需要将指数从 0 旋转到 x^{16},得到 2x^2 ,就像上面所示的整数系数一样。这就是多项式模为 x^d 时的情况。然而,我们的多项式模是 x^d+1 。如上所述,额外的 +1 因子引入了符号变化,这有助于进一步打乱乘法的结果。

        如上所述,将2x^{14} 乘以x^4x^d+1 ,取这一项(由上图的红点表示),围绕环向前旋转4次,通过0点调整系数的值,得到 22x^{2} (或 -2x^{2},如果考虑数值从-12到11而不是0到23)。

首先,2x^{14} 乘以x^4,根据幂运算法则,指数相加,得到 2x^{18}

在模 x^{16}+1 的情况下, x^{18}可写成 x^{16}\cdot x^{2}。又因为 x^d+1 ,所以x^{16}x^d+1 为 -1。

那么x^{18}=x^{16}\cdot x^{2}x^d+1 就变为-1\cdot x^{2}=-x^{2}。而前面的系数2乘以-1得到-2。

如果我们考虑数字从0到23,那么-2等价于22(在模24的情况下),所以结果是22x^{2}。如果我们考虑数字从 -12 到 11,那么结果是-2x^{2}

        这种形式的多项式具有非常丰富的结构和许多优良的性质。它们是分圆多项式的子集。严格来说,将它们中的一个用作多项式模并不是必需的,但这样做可以提供许多便利和加速。

基于多项式环的加解密

        我们已经介绍了用于BFV方案的多项式环的一些性质,现在我们可以讨论其加密和解密的工作原理。首先,我们需要讨论如何生成私钥和公钥,然后讨论如何使用它们进行加密和解密。

公钥和私钥

        加密接收明文,并使用由私钥派生的公钥将其转换为密文,这种从明文到密文的转换只有当你知道私钥的情况下才容易逆转,即从密文还原回明文。

        更具体地说,明文是环上的多项式,其具有多项式模 x^d+1,其中d = 2^n,以及系数模 t。明文加密后为密文,其是由两个环上的、具有相同多项式模的多项式构成的,但系数模为 q,通常 q 远大于 t

        例如,多项式模为 x^{4096} + 1,这意味着明文和密文中的多项式都有 d = 4096 个系数。明文多项式的系数需要模 t = 290764801,密文多项式的系数需要模 q = 9214347247561474048 或更大。

        出于演示目的,我们将使用小得多的数字,但希望这些数字能更好地说明方案的各个步骤中发生了什么。在第一部分中,为了使事情更加直观,我们将使用 d=16, t=7, q=874。注意,这些参数是不安全的!

  • 对于私钥或密钥,我们用 s 表示,它是我们随机生成的一个系数为-1、0或1的多项式。例如:

  • 对于公钥的 pk_1 部分,我们用 a 表示,它是我们从密文空间中随机生成一个多项式,其系数模为q。例如:

  • 误差多项式(噪音),我们用 e 表示,系数很小,来自离散高斯分布。这个多项式在这里使用一次,然后丢弃。例如:

        然后,公钥被定义为一对多项式pk = (pk_0, \ pk_1) = ([-as+e]_q,\ a),其中,多项式运算是求多项式模和系数模 q 的运算。

对于上面给出的示例,公钥的第一个多项式被构造为:

        其中第一个乘法取多项式 a,它的系数来自于对 q 取模的整个范围,然后乘以系数为-1、0或1的 s。由于模上多项式模的多项式的乘法具有“旋转和反射”性质,有效地混合和打乱了 a 的所有系数,并进一步增加了小的噪音。多项式 a 有效地掩盖了公钥中的私钥。

        从公钥破解加密方案基本上需要从 ([-as+e]_q, \ a) 对中计算出 s。唯一的因素是该方案中包含了噪音——如果 e 为零,则很容易从公钥中计算出  s。当 e 足够大,但又不太大时,这是一个难题。

        本文的示例中,私钥可以通过暴力攻击恢复——−尝试每个可能的  s (只有3 ^ 16 = 43046721组合)然后计算 as + e 来寻找出一个接近公钥的第一项的答案。对于真正的参数,这种暴力攻击的方法是完全不可行的。3 ^ 4096 是一个很大的数字,但有更聪明的方法,然后定义给定的一组参数的安全性。

加密

        加密过程看起来有点像公钥生成过程。加密需要一个明文,它是一个系数为模 t 的多项式 ,并将其转换为一对系数为模 q 的多项式。为了说明这一点,我们将加密一个只有两个非零系数的非常简单的多项式消息: m=3+4x^8\equiv 3-3x^8

        加密还需要三个小的多项式。两个误差多项式来自于与公钥误差多项式相同的离散高斯分布,分别为 e_1, e_2,另一个多项式我们称之为 u,它的系数为-1、0或1,就像私钥一样。

        这些多项式只在加密过程中使用,然后丢弃。

        密文由两个多项式表示,计算为: ct=([pk_0u+e_1+qm/t]_q,[pk_1u+e_2]_q)

        请注意消息中的值是在mod t的范围内,而在我们的示例中,它们被缩放为q/t (即128),使它们覆盖mod q的范围。这是消息被插入到密文时的唯一更改。这些值通过添加到第一项来掩盖,第一项的值是在mod q的范围内,与随机的噪音没有区别。u的随机性改变了每次加密中使用的掩码,从而确保相同的明文在每次加密时产生不同的密文。

Note:同态加法和乘法之所以可行,是因为消息仅以缩放的形式存在于密文中。其他项的作用是隐藏消息,并且在只有知道秘密密钥才能移除这些项的情况下,它们在隐藏消息方面被证明是有效的。

        使用上面给出的多项式显式计算密文的第一个元素:

        在密文的第一项中展开公钥,我们看到: ct_0=[e_1+e \cdot u - a\cdot u\cdot s+q \cdot m/t]_q。在这个表达式中,前两项是“小”的,与误差项成比例,后两项是“大”的。第一个大项有效地隐藏了第二个项,也就是明文多项式消息。

        密文的第二个元素是这样计算的:

        在密文的第二个元素中展开公钥,我们可以看到 ct_1=[a \cdot u+e_2]_q 。这展示了解密是如何工作的—如果我们知道 s,我们可以计算 ct_1 \cdot s=[a \cdot u \cdot s+e_2 \cdot s]_q,这可以用来删除密文第一个元素中的非消息大项。

        综上所述,密文可以用公钥、私钥、掩码、噪声和消息表示为:

解密

        如上所述,解密相对简单。首先,我们计算 [ct_0+ct_1 \cdot s]_q ,这将完全从消息中删除掩码。这给了我们一个扩展为 [q\cdot m/t+e_1+e\cdot u+e_2\cdot s]_q 的多项式,即缩放后的信息加上一些噪声项。因此,只要噪声项不是太大,我们就可以恢复消息。

        从图中可以看出,除了两个非零系数( x^8x^0 )外,明文的所有系数都小于q/t=128 。如果我们将这个多项式缩放回对 t 取模的范围,那么我们有:

        四舍五入这些系数恢复我们的消息 m=3-3x^8

        我们通过将近似系数四舍五入后缩放到最接近的整数对应值来获得我们的消息:

绿色-噪音、粉色-近似解

        把这些放在一起,我们通过计算来解密密文:{m}'=[ \left \lfloor q[ct_0+ct_1 \cdot s]_q \right \rceil]_t\left \lfloor \right \rceil 表示舍入到最接近的整数。

        如果系数中噪声太大,那么它们最终会更接近一个与正确整数不同的整数,然后解密将(悄无声息地)失败并产生错误的结果。在上面的例子中,最大的误差是 23/128 ,所以仍然有一些空间允许产生更多的噪音,并且能够正确的解密。可以通过使 q/t比值变大或变小来调整噪声空间净含量。

同态操作

        人们对这类密码体制如此感兴趣的一个主要原因是,它们允许同态加法和乘法(来自希腊语 homo - same,表示"相同" 和 morphe - shape,表示"形态")。这意味着您可以在数字仍然加密的情况下进行加法和乘法运算,而不必先解密。这是一个令人惊叹的功能,有望在数据保护和安全方面构建一个新的黄金标准。

同态加法

        最简单的情况是两个加密数字的相加。假设我们已经用相同的公钥加密了两个多项式 m_1m_2 :

a=([pk_0u_1+e_1+qm_1/t]_q,[pk_1u_1+e_2]_q), \\ b=([pk_0u_2+e_3+qm_2/t]_q,[pk_1u_2+e_4]_q)

        注意,我们需要使用两个不同的小多项式 u_1 和 u_2 ,以及4个小噪声多项式 e_1, e_2, e_3, e_4 来做到这一点。如果我们只是添加相应的密文元素,我们得到一个新的密文:

a+b= \\ ([pk_0(u_1+u_2)+(e_1+e_3)+q(m_1+m_2)/t]_q, [pk_1(u_1+u_2)+(e_2+e_4)]_q)

        由于消息仅存在于具有缩放的密文中,因此加法的结果与加密 m_1+m_2 的形式相同,只是增加了新的噪音:

c=([pk_0(u_3)+(e_5)+q(m_1+m_2)/t]_q,[pk_1(u_3)+(e_6)]_q)

        大致的解密(舍入之前)将为: [q(m_1+m_2)/t+e_5+eu_3+e_6s]_q。这意味着只要新的噪声项不太大,消息 m_1+m_2 就能正确解密。其中噪声有三种类型:

e_5 = e_1 + e_3 \\ eu_3 = e(u_1+u_2) \\ e_6s = (e_2+e_4)s

        我们担心的是,当这些项变得足够大,以至于噪音多项式中的一个系数大于 q/(2t) 时,解密就会失败,因为解密过程结束时的四舍五入操作会四舍五入到错误的数字。

        如果我们只考虑第一项,那么我们就把来自离散高斯分布的多项式中的系数相加。这意味着在某些情况下,我们会把一个负系数加到一个正系数上,结果会更接近于零。在其他情况下,系数会有相同的符号,所以结果会更大。我们可以做很多的同态加法,看看噪音是如何随着加法的数量增加而增加的,这是很有指导意义的。系数的分布如下图所示,其中我们添加了1、5和30个噪音多项式(随机地进行了数百次试验)。

        当我们添加了30个噪音多项式时,某些系数有可能会大于64,即超过了q/t的一半,所以解密不会产生正确的结果。

        另外两项表示不同的情况 —— 第二项是一个噪音多项式乘以一些“小的多项式”(系数为-1、0或1)的总和。这种乘法会产生更大的噪音。一个噪音多项式和一个小的多项式的乘积的系数大约将是随机正负号的噪音多项式系数的2/3rds的总和。这意味着这个噪音与多项式的最高次的平方根 \sqrt n 一致。

        对这一项绘制与上面相同的分布可以看出,它比第一项大得多,而且即使对于我们示例中的参数,也存在错误解密的危险,即使只是添加了几个参数。

        第三项是类似的 —— 一组噪音多项式之和,乘以一个“小的多项式”。它的噪音分布是这样的: 

        结合起来,我们可以画出这三项的最大系数的增长,作为已经发生的加法数量的函数。这是一个须状图,给出了这些最大值的可变性。(注意噪音的均值接近于零,这是最大系数的幅值分布) 

        这表明,对于我们所选择的参数,由两个以上加法产生的密文,解码错误的概率很高,而且两次加法失败的概率也很高。这是因为有时最大错误大于64,当q/t = 128时,会导致不正确的解密,就像这里一样。为了给这样的操作提供更多的空间,我们需要使用更大的q/t比值,这可以应对通常由所执行的操作数量引入的噪音量。

        不幸的是,由密文的同态乘法引入的噪音量又要大得多。

同态乘法

        我们首先回顾下公钥和密文形式:pk = (pk_0,\ pk_1) =([-as+e]_q,\ a)ct=([pk_0u+e_1+qm/t]_q,[pk_1u+e_2]_q)。以及解密初级形态为 [ct_0+ct_1 \cdot s]_q

        同态乘法在程序上很简单,但是比加法复杂得多。如上所述,消息以 qm_1/t 的比例出现在密文的第一个元素中。因此,将两个密文的第一个元素相乘,再乘以t/q,就会得到一个带有 qm_1m_2/t 的项——如果我们仍然能够除去掩码项,这个项就可以恢复。

        因此,要理解同态乘法的机制,关键在于了解如何从密文的乘积中去掉掩码项。要做到这一点,我们的想法是把密文看作是私钥 s 的幂次方的一个简单多项式。这是这篇文章中使用多项式的第三种不同的方法,虽然它有点令人困惑,但是它是理解同态乘法如何工作的关键。

        我们可以写出解密过程的第一部分,使密文的每个元素都是 s 的多项式的系数:[ct_0 + ct_1s^1]_q

        请记住, ct和 s 本身就是多项式,所以这个方程是一个多项式乘以一个多项式 (s^0)加上一个多项式乘以另一个多项式(s^1),然后所有这些都取多项式模 x^d+1和系数模 q

        现在,我们在上面看到解密产生了一个与掩码项 au无关的量:[ct_0 + ct_1s^1]_q \rightarrow \frac{q}{t}m + noise

        好了,现在考虑两个密文 a 和 b,它们被定义为两个消息 m_1 和 m_2 的加密,它们可以被解密:

[a_0 + a_1s^1]_q \rightarrow \frac{q}{t}m_1 + n_1 \\\ [b_0 + b_1s^1]_q \rightarrow \frac{q}{t}m_2 + n_2

        其中 n_1 和 n_2 表示密文中的噪声。

        如果我们取它们的乘积,我们有: [a_0 + a_1s^1]_q[b_0 + b_1s^1]_q \rightarrow (\frac{q}{t}m_1 + n_1)( \frac{q}{t}m_2 + n_2)

右边的表达式与计算 a 和 b 所用的掩码无关,所以左边也必须与它们无关。如果我们把左边展开成 s 的形式(为了方便起见,再乘以 t/q )就得到了: mult(a,b)= c_0 + c_1s + c_2s^2,其中 c_0 = [\frac{t}{q}a_0b_0 ]_qc_1 = [\frac{t}{q}(a_1b_0+a_0b_1) ]_qc_2 = [\frac{t}{q}a_1b_1]_q

        这样做意味着我们可以计算出一个新的密文的组成部分,它比原来的密文多一个元素,并且可以正确地使用密钥 s 的幂次方进行解密。

        解密的形式展开如下: [ \left \lfloor t/q[ct_0s^0+ct_1s^1+ct_2s^2]_q\right \rceil]_t

        这只是增加了一个项,该项是一个多项式乘以另一个多项式的平方。这里需要处理大量的细节追踪工作,但这只是学校水平的代数运算(当然,不包括模数部分!)。这是一种解密步骤的推广,它允许我们解密同态乘法的结果。

        要了解这一切是如何显式地工作的,请考虑 a 和 b 在加密过程中的展开式:

a=([pk_0u_1+e_{11}+qm_1/t]_q,[pk_1u_1+e_{12}]_q), \\ b=([pk_0u_2+e_{21}+qm_2/t]_q,[pk_1u_2+e_{22}]_q)

        如果我们展开乘法的定义,同时对结果进行部分解密(即解密到除以 q/t 和整数之前),那么得到的表达式就很复杂。但是,由于每个密文的组件都是在解密过程中被构造成能够删除掩码项( au_i )的,所以这个展开的结果完全不依赖于来自公钥的掩码项!!!

得到的表达式如下:

ct_0s^0+ct_1s^1+ct_2s^2 \\ = \frac{q}{t}m_1m_2 + e_{22}m_1s+e_{12}m_2s+em_2u_1+em_1u_2+e_{21}m_1+e_{11}m_2 \\ + \frac{t}{q}e^2u_1u_2 + \frac{t}{q}e_{12}e_{22}s^2 + \frac{t}{q}e_{22}esu_1 + \frac{t}{q}e_{12}esu_2 \\ \frac{t}{q}e_{12}e_{21}s + \frac{t}{q}e_{11}e_{22}s + \frac{t}{q}e_{21}eu_1 + \frac{t}{q}e_{11}eu_2 + \frac{t}{q}e_{11}e_{21}

        这里有很多项,但是现在我们已经去掉了掩码,问题是,噪音(除了第一个)与 q/(2t) 的“噪音预算”相比有多大?

        为了感受这一点,我们模拟了大量加密的随机信息的乘法, d = 16, t = 7, q = 7168 = 1024 \times t。各类型噪音的系数大小分布如下图所示。请注意,总的噪音需要大于 q/(2t) = 512 才能导致解密错误。在这些项中,涉及噪音多项式的项、消息和私钥, e_{22}m_1s + e_{12}m_2s 是最大的贡献者。

        上图显示,对于这些参数,最大的贡献来自于包含噪音多项式乘以消息多项式和私钥的项。这种噪音的最大系数约为300。这里有两项,其他的项更小。把所有的噪音合并成一个,就得到了乘法结果的总噪音。这些系数的分布如下图所示: 

重线性化

        上面概述的乘法策略允许我们进行多次乘法,但代价是每次乘法都将密文的大小增加一个多项式。密文在大小上增长可能是一个问题。事实证明,有一些方法可以将密文的大小还原为两个多项式,但代价是增加噪声。这就是所谓的 Relinearisation(重线性化),因为你要去掉 s 多项式中的二次项和更高的项。

        另一项使这种加密方案切实可行的重要技术是将多个消息打包到一个明文中(单指令多数据(SIMD)),通过并行化提高吞吐量。

结论

        粗略地说,加密是将消息隐藏在一个环上的多项式中,并添加一些噪音。每个密文都包含足够的信息,可以在给定私钥的情况下除去自己的掩码。因为密文只涉及到消息的缩放,所以仍然可以对它们执行加法和乘法,并使用一些巧妙的结构来在之后移除掩码。该方案的安全性来自于在不知道私钥的情况下,在噪声存在的情况下很难去除掩码。这个问题的难度具有一些优秀的安全性能,例如没有已知的量子算法来攻击这些系统。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot中解决BeanDefinitionStoreException问题的实战分享

目录 前言1. 问题背景2. 问题分析2.1 异常分析2.2 常见的错误原因2.3 排查过程 3. 解决方案3.1 清理缓存和重建项目3.1.1 清理IDEA缓存3.1.2 使用Maven清理并重建项目 3.2 升级Maven版本3.2.1 下载最新Maven版本3.2.2 IDEA配置新的Maven版本3.2.3 清理缓存并重新构建 3.3 验证问…

Java避坑案例 - 线程池未复用引发的故障复盘及源码分析

文章目录 问题现象问题定位问题代码根因分析现象剖析newCachedThreadPool 源码SynchronousQueue特点构造方法主要方法应用场景Code Demo运行结果 问题修复 问题现象 时不时有报警提示线程数过多,超过2000 个,收到报警后查看监控发现,瞬时线程…

AHB Matrix 四星级 验证笔记(1.8-1.9)scoreboard的实现

文章目录 前言一、scoreboard接收数据的方式和比较行为的策略选择1.接受数据的方式1. 首先是数据从哪儿来? 2.比较数据的方式1.方案一2.方案二3. 方案的选择 二、scoreboard的实现1.代码 三、tip1.编辑断点2. return3.有关函数的返回值:函数内部隐式声明…

商业潜规则揭秘:从成交艺术到客户满意度的全方位策略

潜规则一:成交的艺术——七大核心原则 顾客追求的是超值感,而非单纯低价。 与顾客讨论的重点应是价值,而非价格。 客户没有绝对的对错,关键在于服务是否到位。 销售方式比销售产品本身更重要。 没有绝对最好的产品,只有…

在IDEA2024中生成SpringBoot模板

1、创建新项目 根据自己想要创建的工程类型选择,这里创建的时web工程 生成项目: 注意:SpringBoot只会扫描主程序所在的包及其下面的子包

物流行业信息化整体规划方案|117页PPT

文件是关于“物流行业信息化整体规划方案”的详细规划报告,涵盖了物流信息化咨询项目的规划报告,包括业务理解与需求分析、信息化现状分析、信息化蓝图规划以及实施路径与保障措施等多个方面。以下是对文档内容的总结: 1. 引言:信…

opencv优秀文章集合

文章目录 一、 CV领域1.1 图像处理1.2 目标检测与识别1.3 图像分割、目标追踪1.4 姿态估计1.5 3D视觉1.6 图像生成1.7 机器视觉1.8 其它 二、 nlp三、语音四、推荐系统 《OpenCV优秀文章集合》《OpenCV系列课程一:图像处理入门(读写、拆分合并、变换、注…

Windows转Mac过渡指南

最近由于工作原因开始使用mac电脑,说实话刚拿到手的时候,window党表示真的用不惯。坚持用一下午之后,发现真的yyds,这篇文章说说mac电脑的基本入门指南。 1. 不会使用mac的触摸板,接上鼠标发现滚轮和windows是反的。 …

字符串逆序(c语言)

错误代码 #include<stdio.h>//字符串逆序 void reverse(char arr[], int n) {int j 0;//采用中间值法//访问数组中第一个元素和最后一个元素//交换他们的值&#xff0c;从而完成了字符串逆序//所以这个需要临时变量for (j 0; j < n / 2; j){char temp arr[j];arr[…

安全成为大模型的核心;大模型安全的途径:大模型对齐

目录 安全成为大模型的核心 大模型安全的途径:大模型对齐 人类反馈强化学习(RLHF) 直接偏好优化(DPO) 安全成为大模型的核心 大模型安全的途径:大模型对齐 大模型对齐技术(Alignment Techniques for Large Language Models)是确保大规模语言模型(例如GPT-4)的输…

K8s企业应用之容器化迁移

#作者&#xff1a;曹付江 K8s企业应用之容器化迁移 Kubernetes&#xff08;K8s&#xff09;中的企业应用容器化迁移是一个复杂但重要的过程&#xff0c;平滑的迁移应用&#xff0c;可以让开发、运维、测试人员循序渐进的学习和掌握Kubernetes&#xff0c;通常包括以下步骤&am…

redis详细教程(3.hash和set类型)

hash Redis中的Hash是一种数据结构&#xff0c;用于存储键值对集合。在Redis中&#xff0c;Hash非常适合表示对象&#xff0c;其中对象的每个字段都对应一个键值对。以下是关于Redis中Hash的详细讲解&#xff1a; 特点&#xff1a; 1. 键值对集合&#xff1a;Hash是一个包含…

linux 安装php扩展:xlswriter

这里以xlswriter扩展为例 进入官方扩展&#xff1a;https://pecl.php.net查询自己php对应版本的扩展包 下载扩展 wget https://pecl.php.net/get/xlswriter-1.5.5.tgz 解压扩展 tar -zxvf xlswriter-1.5.5.tgz 进入扩展目录 cd xlswriter-1.5.5 查找对应php版本的phpiz…

SSID,即Service Set Identifier(服务设置的表示符号)

一、什么是SSID&#xff1f; SSID&#xff0c;即Service Set Identifier&#xff0c;是无线网络中的一个标识符&#xff0c;用于区分不同的无线网络。它可以理解为无线网络的名称&#xff0c;当我们在手机或电脑上搜索可用的无线网络时&#xff0c;就是通过SSID来识别和连接的…

LabVIEW过程控制实验平台

A3000实验平台通过LabVIEW开发&#xff0c;实现了过程控制的虚拟仿真与实时通信&#xff0c;显著提高了教学与实验的互动性和效率。该平台采用模块化设计&#xff0c;支持多种控制策略的实验教学&#xff0c;克服了传统实验设备的不足。项目背景 目前高校过程控制实验设备普遍…

强大的文本编辑器Notepad++8.4.6 最新版

Notepad最新版是一款多功能的代码编辑工具。Notepad官方版支持27种编程语言&#xff0c;涵盖C、C 、Java 、C#,、XML、 HTML,、PHP、python等等&#xff0c;能够帮助程序员提高编辑效率。Notepad软件支持python与sql代码高亮功能&#xff0c;并且免费开源&#xff0c;能够完美地…

Halcon 2D测量Metrology找线/圆/矩形/椭圆

通过2D测量&#xff0c;可以获取物体的范围、方向、角度、位置、尺寸和个数等特征。其中&#xff0c;Halcon的2D Metrology模块提供了亚像素级别的卡尺测量功能&#xff0c;可以测量的几何形状包括直线、圆、椭圆、矩形等。对于2D度量&#xff0c;必须提供要测量的对象的位置&a…

PostgreSQL的学习心得和知识总结(一百五十七)|新的 COPY 选项 LOG_VERBOSITY

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

分析 std::optional 的使用与常见错误

文章目录 引言常见错误及解决方案1. 错误使用 std::optional 变量进行算术运算2. 错误检查 std::optional 是否有值3. 忽视 std::optional 的默认值 结论 引言 std::optional 是 C17 引入的一个模板类&#xff0c;用于表示可能有也可能没有值的情况。它特别适用于函数返回值&a…

大模型中的token是什么;常见大语言模型的 token 情况

目录 大模型中的token是什么 常见大语言模型的 token 情况 大模型中的token是什么 定义 在大模型中,token 是文本处理的基本单位。它可以是一个字、一个词,或者是其他被模型定义的语言单元。简单来说,模型在理解和生成文本时,不是以完整的句子或段落为单位进行一次性处理…