MP-SPDZ详细介绍

news/2024/5/20 23:22:50/文章来源:https://blog.csdn.net/shuizhongmose/article/details/127267360

基础知识概述

隐私计算底层协议包括两种:其一是基础的加密传输协议,用于信息分发,包括不经意传输、秘密分享、同态加密、零知识证明等。其二是加密计算协议,包括乱码电路、同态加密、零知识证明等。

  • 不经意传输是所有隐私计算协议的基础,是基本的两方加密协议,用于n选m数据的加密传输。
  • 秘密共享是一种多用于组织间秘密数据的共享与保护,比如多组织间共享密钥的加密存储,是隐私计算的基础协议之一。经典的秘密分享算法有Shamir门限秘密共享方案。
  • 乱码电路通过加密来掩盖电路的输入和电路的结构,以此来实现各个参数参与者的隐私信息的保密,再通过电路计算来实现安全多方计算的目标函数计算。乱码电路有布尔电路和算术电路两种。算术电路适用于整数的加法和乘法,二进制电路比较适合比较等。布尔电路通过与门、或门、非门来模拟任意的函数(加法、乘法、比较);算术电路直接进行加法、乘法运算,也可以构造比较器。常见的乱码电路协议有:姚氏乱码电路(姚氏GC,或姚氏混淆电路)、GMW、BGW、BMR、SPDZ等。
  • 同态加密是指对加密数据进行加减、乘除运算。分为半同态、类同态、全同态。其中半同态是仅支持一种密文运算(有限次的同态加或有限次的同态乘)。类同态同时支持有限的同态加和有限的同态乘。全同态加密支持任意形式的加密运算。半同态加密算法常用的算法有Paillier算法。目前主流的全同态加密算法包括BGV方案、BFV方案和CKKS方案等。
  • 零知识证明指证明者能够在不向验证者提供任何有用信息的情况下,使验证者相信某个论断是正确的,允许证明者、验证者证明某个提议的真实性,却不必泄露除了“提议是真实的”之外的其他信息。常见的零知识证明有交互式零知识证明和非交互式零知识证明。非交互式零知识证明最典型的是zkSNARK(zero-knowledge Sucinct Noninteractive ARguments of Knowledge)技术。zkSNARK的基础是算术电路。

MP-SPDZ项目介绍

从开源的代码完整度、功能、性能、安全性等多方面进行对比,最后选定MP-SPDZ作为隐私计算演示平台实现方案。

基本介绍

MP-SPDZ是SPDZ-2(Keller等人,CCS’13)的分支,SPDZ是多方计算(MPC)协议SPDZ(Damgård等人,Crypto’12)的实现。MP-SPDZ将SPDZ-2扩展到了34种MPC协议,所有这些协议都可以用同一个基于Python的高级编程接口来使用。这大大简化了不同协议和安全模型的成本比较。这些协议涵盖了所有常用的安全模型(诚实/不诚实的多数人和半诚实/恶意模型),以及二进制和算术电路的计算(后者的模数为素数和二次幂)。所采用的基本基元包括秘密共享、不经意传输、同态加密和混淆电路。参考论文《MP-SPDZ-A Versatile Framework for Multi-Party Computation》。

架构设计

在这里插入图片描述

图 MP-SPDZ 项目架构图

虚拟机VM

MP-SPDZ虚拟机代码见【MP-SPDZ/Processor】目录。

多方安全计算虚拟机的主要特点是涉及通信的指令允许参数数量不受限制,从而最大限度地减少通信轮数。因为在多方安全计算中,份额的加法和乘法之间不仅存在数量上的差异,而且存在质量上的差异。因此前者可以在本地完成,而后者涉及通信。这种质的差异具有因协议而异的含义,由于网络延迟,不受限制的并行化通信的好处是显而易见的。

MP-SPDZ使用时需要明确指定类型,因为每个计算域中数字的大小是不同的。

MP-SPDZ的虚拟机为每种基本数据类型提供无限数量的寄存器。寄存器编号被硬编码到字节码中。寄存器通常用于存储指令的输入和输出,他们是本地线程的。

MP-SPDZ内存供数组、矩阵和高维结构使用。内存阵列是全局的,因此运行线程之间传递消息。与寄存器不同,可以使用存储器在整数寄存器中的运行时值来访问内存。内存必须在编译时分配。

MP-SPDZ提供以下几种指令类型:拷贝,基本计算(加、减、乘、除、移位等线性运算),安全指令(比如私有输入、乘法,公共输出等),预处理信息,控制流,高级输入输出(比如打印、客户端通信等),协议信息(比如获取计算方数量等)等。

MP-SPDZ提供矢量化功能,意味着根据请求对能尽可能多地连续寄存器执行相同的操作。这大大减少编译期间和执行期间表示重复计算的的开销。矢量化还有助于将值结构化地连续加载到寄存器中

MP-SPDZ提供多线程功能,但是要求最大线程数在编译时就知道,所以线程数必须使用常量指定。

Compiler

Compiler作用是将使用Python编写的隐私计算应用代码编译为虚拟机可以执行的字节码。

MP-SPDZ 遵循 Python 的动态类型范式。 这使得编程更加直观,例如,任何涉及秘密和公共值的操作都会产生秘密值。

基本块。 这个概念取自一般编译器设计,表示没有分支的指令序列。 编译器仅在基本块的上下文中执行最小化优化,因为它需要重新排列指令。

MP-SPDZ与SPDZ-2的区别是:前者独立地合并不同操作,而后者适用Beaver乘法将乘法减少到开口,使得后者不支持不使用Beaver乘法的协议。MP-SPDZ编译器的打开过程分为了两步(startopen和stoopopen),使得在等待网络信息的时候可以执行本地计算,减少耗时,但是增加了编译器复杂性。MP-SPDZ打开过程总共分为3步:首先创建所有指令的有向无环图,然后根据轮次合并算法合并指令,最后根据依赖图的关系拓扑输出。

MP-SPDZ支持编译时和运行时公共数据的循环,应用中通过函数装饰器执行循环。MP-SPDZ通过trade-off的方式在循环合并和通信之间进行了平衡:通过使用生成指令数量的预算来调整他们的方法,该预算用作总编译成本的代理。

基本库

MP-SPDZ的基本库包括以下几种:

隐私计算数据分发加密协议:不经意传输(OT)、秘密分享(SS)、同态加密(FHE、FHEOffline)、SimpleOT(第三方库);

乱码电路协议:GC、Yao、BMR;

密码库:ECDSA;

数据库:Math、MPIR(开源的多精度整数和有理数计算库);

网络处理库:Networking

其他库:Utils、Tools、SIMDE(本机不支持它们的硬件上提供了 SIMD 内在函数的快速、可移植实现,例如在 ARM 上调用 SSE 函数)、Scripts(脚本库);

编译工具:comiple.py。

协议

MP-SPDZ根据计算加法、乘法的方法分为如下几种协议:

安全模型Mod prime / GF(2^n)Mod 2^kBin. SS(二进制秘密分享)Garbling(混淆电路)
恶意安全模型 多数不诚实安全模型MASCOT / LowGear / HighGearSPDZ2kTiny / TinierBMR
隐蔽安全模型 多数不诚实安全模型CowGear / ChaiGearN/AN/AN/A
半诚实安全模型 多数不诚实安全模型Semi / Hemi / Temi / SohoSemi2kSemiBinYao’s GC / BMR
恶意安全模型 多数诚实安全模型Shamir / Rep3 / PS / SYBrain / Rep / PS / SYRep3 / CCD / PSBMR
半诚实安全模型、多数诚实安全模型Shamir / ATLAS / Rep3Rep3Rep3 / CCDBMR
半诚实安全模型 dealer安全模型DealerDealerDealerN/A

MP-SPDZ可以通过编译时指定协议类型,适配多种MPC协议。各协议的简介如下所示:

(1)MASCOT 指的是Faster Malicious Arithmetic Secure Computation with Oblivious Transfer,即使用不经意传输实现的快速抗恶意算数安全计算。MASCOT协议在安全性上,可以对抗大多数参与方是静态的、恶意的情况。“大多数”指的是在总共个参与方中,可以有至多个参与方是不诚实的。“静态”指的是在协议开始执行之前,这些不诚实的参与方就已经确定了。“恶意”指的是这些不诚实的参与方,不仅会尝试从协议中窥探其他人的数据,而且会主动破坏协议的执行,让协议输出不正确的结果。

MASCOT协议是计算算术电路的,需要实现安全的加法和乘法。MASCOT整体上分为离线和在线两部分,其中离线部分用来进行预处理,在线部分用来计算所需要的函数。离线部分与在线部分是独立的,与参与方的输入、所需计算的函数无关。

(2)SPDZ为可认证秘密分享方案。SPDZ方案的核心思想是设置一个全局MAC(Message Authenticated Code,消息认证码)密钥,但任何参与方都无法得到这个全局MAC密钥。SPDZ是同时支持同态加法和同态常量乘法。在恶意攻击模型下SY/SPDZ-wise是最高效的模型,因为它需要最少的通信,并且是唯一一种提供持续通信的点积。

(3)LowGear和HighGear的虚拟机运行类似于Rotaru等人的密钥生成。主要区别在于使用 daBits(doubly-authenticated bits) 生成 maBits。

(4)CowGear和ChaiGear表示LowGear和HighGear的秘密安全版本。在所有相关程序中,选项在两者中激活TopGear零知识证明。

(5)Hemi和Soho分别表示LowGear和HighGear的剥离版本,用于类似于Semi的半诚实安全性,即使用半同态加密生成加法共享的Beaver三元组。Temi反过来又表示Cramer等人对基于LWE的半同态加密的适应性。Hemi和Temi都使用Halevi和Shoup的对角线填料进行矩阵乘法。ATLAS 的扩展性优于普通的 Shamir 协议,Temi 的扩展性优于 Hemi 或 Semi。ATLAS支持更多参与方的情况。

(6)Tiny 表示 SPDZ2k 对二进制设置的适应。特别是,SPDZ2k牺牲对位不起作用,因此我们根据Furukawa等人将其替换为cut-and-choose。

非线性计算

虽然加法和乘法的计算因协议而异,但非线性计算,例如算术域中的比较(模数不是 2)在整个 MP-SPDZ 中只有三种形式:

(1)未知素数模。这种方法可以追溯到 Catrina 和 de Hoogh。 它主要依赖于在算术域中使用秘密随机位。足够多的此类位允许屏蔽一个秘密值,以便安全地显示屏蔽值。 然后可以将其拆分为位,因为它是公开的。然后使用公共位和秘密掩码位来计算许多非线性函数。相同的想法已被用于实现定点和浮点计算。我们将此方法称为“未知素数模数”,因为它只要求给定明文范围的最小模数大小,大致是明文位长度加上统计安全参数。它的缺点是隐式执行明文范围。

(2)已知素数模。Damgård 等人已经提出了涉及精确素数模数的非线性计算。MP-SPDZ已经实现了 Nishide 和 Ohta 的精细位分解,这使得进一步的非线性计算成为可能。MP-SPDZ对这种方法的假设是明文空间在以素数为模的全范围内略小。这允许通过取一个差异并提取最高有效位来进行比较,这与上述实现两个正数模素数比较的工作不同。MP-SPDZ还使用了 Makri 等人的想法,即如果k位的随机数足够接近,则该随机数与模数p无法区分。

(3)二次幂模数。在非线性计算的背景下,素数模数设置有两个重要区别:

(a)乘以 2 的幂有效地擦除了一些最高有效位。

(b)没有使用乘法的右移。以素数为模,乘以2的倒数的幂允许将具有足够零作为最低有效位的数字右移。

非线性计算的另一种方法是切换到部分计算的二进制计算。MP-SPDZ 实施了许多工作为特定安全模型提出的协议:Demmler 等人、Mohassel 和 Rindal 以及 Dalskov 等人。 MP-SPDZ 还实现了更通用的方法,例如 daBits 和 edaBits。下表是各协议对应的二进制计算方法:

协议二进制计算
MASCOT, SPDZ2k, LowGear, HighGear, CowGear, ChaiGearTinier with improved cut-and-choose analysis by Furukawa et al.
Semi, Hemi, Temi, Soho, Semi2kSemiBin (Beaver triples modulo 2 using OT)
Malicious ShamirMalicious Shamir over for secure sacrificing
Malicious Rep3, Post-Sacrifice, SPDZ-wise replicatedMalicious Rep3 modulo 2
Rep4Rep4 modulo 2
ShamirShamir over
ATLASATLAS over
Rep3Rep3

内部接口

MP-SPDZ 大量使用模板来允许在不同协议之间重用代码。 run() 就是一个简单的例子。 Processor目录下的整个虚拟机都是基于同样的原理构建的。中心类型是表示特定类型中的份额的类型。

所有协议的接口都分四个阶段进行:

(1)初始化。 这是在连续使用中初始化和重置数据结构所必需的;

(2)本地数据准备;

(3)沟通;

(3)输出提取。

代码示例如下:

protocol.init_dotprod(&processor);
for (int i = 0; i < n; i++)protocol.prepare_dotprod(a[i], b[i]);
protocol.next_dotprod();
protocol.exchange();
c = protocol.finalize_dotprod(n);

值得注意的是,在MP-SPDZ中内部接口通常不是线程安全的。所以在整个程序中只使用一个 ProtocolSetup 实例,并且每个线程应该只使用一个CryptoPlayer/PlainPlayer 和 ProtocolSet 实例。

内部接口列表参考【官方文档Low-Level Interface】。

预处理

MP-SPDZ的预处理大部分是进行随机性的产生。通常用于半诚实和恶意安全或其他协议的特定实现,比如平方计算、daBits、edaBits生成等。其中daBits和edaBits是上述非线性计算中算术和二进制数据类型之间的转换技术。daBits是扩展的双重认证位(edaBits),它对应于算术域中的共享整数,其位分解在二进制域中共享。

预处理的目的是为了避免不必要的计算,这点与SCALE-MAMBA不同。后者在每次运行计算时由于都会生成使用较少的正方形产生的问题,这不仅会减慢计算速度,还会导致应用程序在最后似乎挂起,因为预处理尚未完成。

High-Level API

High-Level API向上层提供底层调用接口。包括整数操作、小数操作和其他复杂功能。

其中小数操作包括定点数和浮点数操作。

复杂功能包括机器学习、不经意传输结构、二进制电路等。

机器学习提供逻辑回归和深度学习推理的功能。前者运行sigmoid函数的准确实现和类似ABY3的近似值之间进行选择。后者支持MobileNets中使用的量化方案及DenseNet、ResNet、SqueezeNet等几种ImageNet解决方案。

不经意传输结构包括数组、队列和堆栈实现。这些结构都支持秘密状态下的读和写。Oblivious RAM(ORAM)技术在大规模数据下是实现高效计算的核心技术。比如ORAM库包含了 Dijkstra 算法的示例实现,用于图形中的最短路径,以及用于稳定匹配的 Gale-Shapley 算法。

二进制电路模块包含使用所谓 Bristol Fashion 格式的电路的功能。由于二进制电路只包括与、或、非三种门。Bristol Fashion 格式的电路则新设计了多种电路门,比如MAND,门操作(XOR、AND、INV、EQ、EQW 或 MAND)等。

隐私计算应用

基于上述High-Level API的定义,用户可以使用对应的接口实现特定的隐私计算功能,比如基本计算、联合统计、隐匿查询、安全求交、特征工程、联合建模、联合与的等功能。

接口文档参考【官方接口文档手册】。示例代码参考【MP-SPDZ/Programs/Source/】目录。

MP-SPDZ性能对比

MPC计算模块会被封装为隐私计算SDK部署在MPC节点上,由隐私计算合约进行调用。

MP-SPDZ与其他MPC框架题在i7处理器,2.8GHz下同时对两个100000元素的数组进行内积运算,性能对比如下表所示。

SH 2-party (OT)SH replicated 3-partyShamirMalicious ShamirSPDZ (HighGear)Yao’s GC (32-bit)
ABY1.8
ABY30.02
EMP-toolkit10
MPyC8.45
Obliv-C29
ObliVM700
PICCO0.10
SCALE-MAMBA8.3314
MP-SPDZ0.90.030.080.4679

MP-SPDZ目录结构介绍

.├── bin├── BMR│ └── network├── Compiler│ └── GC├── doc│ └── \_static├── ECDSA├── ExternalIO├── FHE├── FHEOffline├── GC├── local│ ├── include│ ├── lib│ └── share│ └── info├── logs├── Machines├── Math├── mine-scripts│ └── dockers├── mpir│ ├── autom4te.cache│ ├── cxx│ ├── devel│ ├── doc│ │ └── devel│ ├── fft│ ├── mpf│ ├── mpir.net│ │ ├── build.vc│ │ ├── build.vc11│ │ │ ├── mpir.net│ │ │ └── mpir.net-tests│ │ ├── build.vc12│ │ │ ├── mpir.net│ │ │ └── mpir.net-tests│ │ ├── build.vc14│ │ │ ├── mpir.net│ │ │ └── mpir.net-tests│ │ ├── build.vc15│ │ │ ├── mpir.net│ │ │ └── mpir.net-tests│ │ ├── mpir.net│ │ └── mpir.net-tests│ │ ├── HugeFloatTests│ │ ├── HugeIntTests│ │ ├── HugeRationalTests│ │ ├── IntegrationTests│ │ ├── OtherTests│ │ ├── Properties│ │ └── Utilities│ ├── mpn│ │ ├── alpha│ │ │ ├── ev5│ │ │ ├── ev6│ │ │ └── ev67│ │ ├── arm│ │ ├── generic│ │ ├── ia64│ │ ├── mips32│ │ ├── mips64│ │ ├── powerpc32│ │ │ ├── 750│ │ │ └── vmx│ │ ├── powerpc64│ │ │ ├── mode32│ │ │ ├── mode64│ │ │ └── vmx│ │ ├── sparc32│ │ │ └── v9│ │ ├── sparc64│ │ ├── x86│ │ │ ├── applenopic│ │ │ │ └── core2│ │ │ ├── core2│ │ │ ├── fat│ │ │ ├── i386│ │ │ ├── i486│ │ │ ├── k6│ │ │ │ ├── k62mmx│ │ │ │ └── mmx│ │ │ ├── k7│ │ │ │ └── mmx│ │ │ │ └── k8│ │ │ ├── nehalem│ │ │ ├── p6│ │ │ │ ├── mmx│ │ │ │ └── p3mmx│ │ │ ├── pentium│ │ │ │ └── mmx│ │ │ └── pentium4│ │ │ ├── mmx│ │ │ └── sse2│ │ ├── x86_64│ │ │ ├── atom│ │ │ ├── bobcat│ │ │ ├── bulldozer│ │ │ │ └── piledriver│ │ │ ├── core2│ │ │ │ └── penryn│ │ │ ├── fat│ │ │ ├── haswell│ │ │ │ ├── avx│ │ │ │ └── broadwell│ │ │ ├── k8│ │ │ │ ├── k10│ │ │ │ │ └── k102│ │ │ │ └── k8only│ │ │ ├── nehalem│ │ │ │ └── westmere│ │ │ ├── netburst│ │ │ ├── sandybridge│ │ │ │ └── ivybridge│ │ │ └── skylake│ │ │ └── avx│ │ ├── x86_64w│ │ │ ├── atom│ │ │ ├── bobcat│ │ │ ├── broadwell│ │ │ │ └── avx│ │ │ ├── bulldozer│ │ │ │ └── piledriver│ │ │ ├── core2│ │ │ │ └── penryn│ │ │ ├── fat│ │ │ ├── haswell│ │ │ │ └── avx│ │ │ ├── k8│ │ │ │ └── k10│ │ │ │ └── k102│ │ │ ├── nehalem│ │ │ │ └── westmere│ │ │ ├── netburst│ │ │ ├── sandybridge│ │ │ │ └── ivybridge│ │ │ └── skylake│ │ │ └── avx│ │ └── x86w│ │ ├── p3│ │ │ └── p3mmx│ │ ├── p4│ │ │ ├── mmx│ │ │ └── sse2│ │ ├── p6│ │ │ ├── mmx│ │ │ └── p3mmx│ │ └── pentium4│ │ ├── mmx│ │ └── sse2│ ├── mpq│ ├── mpz│ ├── printf│ ├── scanf│ ├── tests│ │ ├── cxx│ │ ├── devel│ │ ├── fft│ │ ├── misc│ │ ├── mpf│ │ ├── mpn│ │ ├── mpq│ │ ├── mpz│ │ └── rand│ └── tune├── Networking├── OT├── Player-Data│ ├── 2-2-128│ ├── 2-p-128│ ├── 2-p-192│ └── 2-TT-8├── Processor├── Programs│ ├── Bytecode│ ├── Circuits│ ├── Public-Input│ ├── Schedules│ └── Source├── Protocols├── Scripts├── simde│ ├── docker│ │ ├── bin│ │ └── cross-files│ ├── simde│ │ ├── arm│ │ │ └── neon│ │ ├── wasm│ │ └── x86│ │ └── avx512│ └── test│ ├── arm│ │ └── neon│ ├── cmake│ ├── common│ ├── docker│ ├── munit│ ├── wasm│ └── x86│ └── avx512├── SimpleOT├── Tools├── Utils└── Yao

参考文献

(1)官方手册

(2)MP-SPDZ Github

(3)官方论文:MP-SPDZ-A Versatile Framework for Multi-Party Computation

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

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

相关文章

python 运行错误收集

目录global全局声明错误 global全局声明错误 SyntaxError: name is_login is used prior to global declaration 解决办法:global is_login 放在 if is_login:的上面 is_login = Falsedef login_auth(func_name):def inner(*args, **kwargs):if is_login:res = func_name(*arg…

AlphaZero强化学习模型

搬来了DeepMind的AlphaTensor DeepMind前不久发在Nature上的论文Discovering faster matrix multiplication algorithms with reinforcement learning引发热议。 这篇论文在德国数学家Volken Strassen「用加法换乘法」思路和算法的基础上&#xff0c;构建了一个基于AlphaZero…

[GWCTF 2019]我有一个数据库

打开题目是乱码&#xff0c;好奇怪 御剑扫一下 扫到了phpmyadmin 版本为4.8.1 这个版本是有漏洞的&#xff08;CVE-2018-12613&#xff09;&#xff0c;复现一下 部分源码&#xff1a; $target_blacklist array (import.php, export.php ); ​ // If we have a valid target…

SpringBoot统一处理返回格式

在对接第三方接口的时候&#xff0c;第三方接口返回格式形式为{"result":null,"status":1010}&#xff0c;虽然返回了状态码&#xff0c;但是状态码对应的描述信息并没有携带&#xff0c;前端在使用的时候需要根据状态码返回一个友好的提示&#xff0c;如此…

刘韧:我每时每刻都会注意管理自己的知识

1. 担心总能让我积极行动起来。2. 要提早主动求变&#xff0c;不要等到被迫地、见招拆招地应变。3. 很多愚蠢的念头&#xff0c;都源于自己分内的事&#xff0c;却老想让别人负责&#xff0c;比如将自己的愿望寄托在子女身上。4. 推卸责任的同时&#xff0c;多少会对等地给予一…

ShardingSphere 5.2.0:分片审计功能拦截多分片场景下的不合理请求

一、背景Apache ShardingSphere 基于用户的实际使用场景&#xff0c;为用户打造了多种实用功能&#xff0c;包括数据分片、读写分离等。在数据分片功能中&#xff0c;我们发现有些用户涉及到的分片较多&#xff0c;一个分片逻辑表可能对应后端 1000 个物理表&#xff0c;这给用…

猿创征文 | 国产数据库实战之TiDB 数据库快速入门

猿创征文 | 国产数据库实战之TiDB 数据库快速入门一、系统检查1.检查系统版本2.查看本地IP地址3.TiDB集群介绍二、快速部署本地测试集群1.安装 TiUP工具2.声明全局环境变量3.快速部署TiDB 集群三、连接 TiDB 数据库1.新开一个session 以访问 TiDB 数据库2.通过Mysql客户端连接T…

SpringSecurity整合JWT+Oauth2认证

没写完&#xff0c;推荐下面的博客 推荐博客<查看pom依赖、数据库sql、实体类、数据映射>&#xff1a;SpringSecurity框架 推荐博客<查看SpringSecurity整合JWTOauth2认证>&#xff1a;SpringSecurity整合JWTOauth2认证 一 创建项目 测试浏览器&#xff1a;建议使用…

网课查题系统-公众号轻松调用方法

网课查题系统-公众号轻松调用方法 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&am…

Django ORM F对象和Q对象查询

Django ORM F对象和Q对象查询1.F对象查询2.Q对象查询Django提供了两个非常有用的工具&#xff1a;F对象和Q对象&#xff0c;方便了在一些特殊场景下的查询过程。 1.F对象查询 F对象用于操作数据库中某一列的值&#xff0c;它可以在没有实际访问数据库获取数据值的情况下对字段…

史上最简SLAM零基础解读(7) - Jacobian matrix(雅可比矩阵) → 理论分析与应用详解(Bundle Adjustment)

本人讲解关于slam一系列文章汇总链接:史上最全slam从零开始 文末正下方中心提供了本人联系方式&#xff0c;点击本人照片即可显示WX→官方认证{\color{blue}{文末正下方中心}提供了本人 \color{red} 联系方式&#xff0c;\color{blue}点击本人照片即可显示WX→官方认证}文末正…

基于微信小程序的毕业设计题目(23)php汽车维修保养小程序(含开题报告、任务书、中期报告、答辩PPT、论文模板)

项目背景和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于微信汽车维修保养小程序系统&#xff0c;前台用户使用小程序&#xff0c;小程序使用微信开发者工具开发&#xff1b;后台管理使用基PPMySql的B/S架构&#xff0c;开发工具使用phpstorm&#xff1b;通过后…

毕业设计 单片机stm32智能路灯智能灯控系统 - LoRa远程通信

文章目录0 前言1 简介2 主要器件3 实现效果4 设计原理4.1 Lora模块4.2 DHT11温湿度传感器4.3 光照传感器5 部分核心代码6 最后0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩…

springboot使用布隆过滤器——缓存穿透

目录 1.布隆过滤器原理 2.具体使用场景 3.springboot集成布隆过滤器 4.总结 1.布隆过滤器原理 布隆过滤器&#xff08;Bloom Filter&#xff09;是非常经典的以空间换时间的算法。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否…

虹科分享 | 什么是深度数据包检测(DPI)

深度数据包检测 (DPI) 是一种分析通过网络发送的流量的高级方法。DPI 使用数据处理来检查数据包的特定细节&#xff0c;作为数据包过滤的一种形式。 虽然 DPI 用于查看 OSI 模型的第 2-7 层&#xff0c;但仅当设备可以查看并根据第 3 层或更高层采取行动时&#xff0c;它才被视…

rsync+inotify实时同步

查看主页俩篇 inotify、rsync 编写脚本实现inotify与rsync相结合 客户端 #!/bin/bash Path/root/rsync_data backup_Server192.168.80.132 /usr/bin/inotifywait -mrq --format %w%f -e create,close_write,delete $Path | while read line do if [ -f $line ];then rsync -…

7个最佳WordPress设计师和摄影师作品插件

您是一名设计师或摄影师&#xff0c;正在寻找在 WordPress 中构建作品网站的最简单方法吗&#xff1f; 微信扫描二维码用手机阅读或收藏 有很多WordPress作品插件&#xff0c;可让您轻松构建漂亮的作品网站。 但是&#xff0c;对于初学者来说&#xff0c;找到完美的作品插件插…

从深圳寄东西到加拿大,用什么快递比较好?

哪家快递好这个是没有定论的&#xff0c;合适自己的渠道才是好渠道&#xff0c;通常情况下&#xff0c;四大快递和EMS这些基本都是没什么大问题的。下面方联国际物流就来带大家了解一下从深圳寄东西到加拿大的几种主要方式。目前有4种方式运输到加拿大&#xff1a;专线、快递、…

MaxCompute 笛卡尔积逻辑的参数优化复杂JOIN逻辑优化

1. 优化概述 最近协助一个项目做下优化任务的工作。因为主要数据都是报表&#xff0c;对数对的昏天暗地的不敢随便调整SQL逻辑&#xff0c;所以本身只想做点参数调整&#xff0c;但是逼不得已后来还是改了一下SQL。 这篇文章主要讲一个SQL优化反映的两个优化点。分别是&#…

AC 自动机算法介绍

一 点睛 AC 自动机是 KMP 算法和 Trie 树的结合&#xff0c;是经典的多模匹配算法。首先将多个模式串构建一棵字典树&#xff0c;然后在字典树上添加失配指针&#xff0c;失配指针相当于 KMP 算法中的 next 函数&#xff08;匹配失败时的回退位置&#xff09;&#xff0c;最后…