《深入挖掘Python加解密:自定义加密算法的设计与实现》
利用python实现加解密
在正式编写各种加解密前,我们先写个小案例,如下。
封面在文末呦!
基础加解密-源码
# 加密
def encode():source01 = '乐茵'for c in source01:ascii01 = ord(c)ascii01 += 1print(chr(ascii01), end='')# 解密
def decode():source02 = '乑茶'for c in source02:ascii01 = ord(c)ascii01 -= 1print(chr(ascii01), end='')if __name__ == '__main__':# encode()decode()
基础加解密-源码解析
这段代码包含两个函数:encode()
和 decode()
,以及一个主程序入口
encode() 函数
这个函数的作用是对字符串 "乐茵" 进行加密。加密的方法是将每个字符的 ASCII 码值加 1,然后将新的 ASCII 码值转换回字符。
-
定义一个字符串
source01
,值为 "乐茵"。 -
使用 for 循环遍历
source01
中的每个字符c
。 -
使用
ord()
函数获取字符c
的 ASCII 码值,将其赋值给ascii01
。 -
将
ascii01
的值加 1。 -
使用
chr()
函数将新的 ASCII 码值转换回字符,并打印出来。注意这里使用end=''
参数,使得打印结果不换行。
decode() 函数
这个函数的作用是对字符串 "乑茶" 进行解密。解密的方法是将每个字符的 ASCII 码值减 1,然后将新的 ASCII 码值转换回字符。
-
定义一个字符串
source02
,值为 "乑茶"。 -
使用 for 循环遍历
source02
中的每个字符c
。 -
使用
ord()
函数获取字符c
的 ASCII 码值,将其赋值给ascii01
。 -
将
ascii01
的值减 1。 -
使用
chr()
函数将新的 ASCII 码值转换回字符,并打印出来。注意这里使用end=''
参数,使得打印结果不换行。
主程序入口
在主程序入口中,调用 decode()
函数进行解密操作。如果需要加密,可以取消 encode()
函数前的注释,然后注释掉 decode()
函数的调用。
这段代码的主要作用是演示了一个简单的字符加密和解密方法,即将每个字符的 ASCII 码值加 1 或减 1。这种方法非常简单,但安全性较低,不适用于实际的安全需求。
base64加解密-源码
# base64加密
import base64# 二进制与十六进制完全等价在计算机中,每四个二进制位等于一个十六进制位source = 'echo'
print(base64.b64encode(source.encode()))# base64解密
source = 'ZWNobw=='
print(base64.b64decode(source.encode()))def decode():de_source = 'ZWNobw=='print(base64.b64decode(de_source).decode())# 对文件进行编码
def file_encode():with open('文件引用/index.png', 'rb') as file:data = file.read()print(base64.b64encode(data).decode())# 对base64还原成文件
def file_decode():file_source = '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'data = base64.b64decode(file_source)with open('文件引用/index_1.png', 'wb') as file:file.write(data)if __name__ == '__main__':# file_encode()file_decode()
base64加解密-源码解析
这段代码主要演示了如何使用Python的base64
库进行编码和解码操作
base64编码部分
import base64source = 'echo'
print(base64.b64encode(source.encode()))
-
导入
base64
库。 -
定义一个字符串
source
,值为'echo'。 -
使用
base64.b64encode()
函数对字符串进行编码。注意,b64encode
需要接收字节类型的数据,所以使用source.encode()
将字符串转换为字节。 -
打印编码后的结果。
base64解码部分
source = 'ZWNobw=='
print(base64.b64decode(source.encode()))
-
定义一个字符串
source
,值为'ZWNobw==',这是'echo'的base64编码结果。 -
使用
base64.b64decode()
函数对字符串进行解码。同样地,需要先将字符串转换为字节。 -
打印解码后的结果。
decode函数
def decode():de_source = 'ZWNobw=='print(base64.b64decode(de_source).decode())
这个函数与上面的解码部分功能相同,但将解码后的字节数据再转换回字符串并打印。
file_encode函数
def file_encode():with open('文件引用/index.png', 'rb') as file:data = file.read()print(base64.b64encode(data).decode())
-
打开一个名为'文件引用/index.png'的文件,并以二进制模式读取。
-
读取文件内容到
data
变量。 -
对文件内容进行base64编码,并打印编码后的结果。
file_decode函数
def file_decode():file_source = 'iVBORw0KGgoAAAANSUhEUgAA...'data = base64.b64decode(file_source)with open('文件引用/index_1.png', 'wb') as file:file.write(data)
-
定义一个字符串
file_source
,值为一个很长的base64编码字符串(这里省略了部分内容)。 -
对该字符串进行base64解码,得到原始的二进制数据。
-
打开一个名为'文件引用/index_1.png'的文件,并以二进制模式写入。
-
将解码后的二进制数据写入文件。
主程序入口
if __name__ == '__main__':# encode()decode()# file_encode()file_decode()
主程序入口部分注释了encode()
和file_encode()
函数,只执行了decode()
和file_decode()
函数。如果需要执行编码操作,可以取消相应函数的注释。
总结:这段代码主要演示了如何使用Python的base64
库对字符串和文件进行编码和解码操作。
AES加解密-源码
from Crypto.Cipher import AES
from binascii import b2a_hex
from binascii import a2b_hex
# AES加密
source = 'kfc-v50'
# 第一步,补足16位
# 如果source不足16位的倍数就用空格补足16位
if len(source.encode('utf-8')) % 16:add = 16 - (len(source.encode('utf-8')) % 16)
else:add = 0
source = source + ('\0' * add)
print(source)# 第二步,定义密钥
# 定义偏移量,必须是16,24,32位
key = 'today-is-thursday-kfc-permit-v50'.encode()
mode = AES.MODE_CBC
iv = b'1234567890ABCDEF'
cryptos = AES.new(key, mode, iv)
cipher = b2a_hex(cryptos.encrypt(source.encode()))
print(cipher.decode())# AES解密
# cipher = '加密密文'key = 'today-is-thursday-kfc-permit-v50'.encode()
mode = AES.MODE_CBC
iv = b'1234567890ABCDEF'
cryptos = AES.new(key, mode, iv)
dest = cryptos.decrypt(a2b_hex(cipher))
print(dest.decode().rstrip('\0'))
AES加解密-源码解析
这段代码使用了Python的pycryptodome
库来实现AES加密和解密。以下是对代码的详细分析:
导入模块
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
-
Crypto.Cipher.AES
:提供了AES加密算法的实现。 -
binascii.b2a_hex
和binascii.a2b_hex
:用于在二进制数据和十六进制字符串之间进行转换。
AES加密部分
1. 数据预处理(填充)
source = 'kfc-v50'if len(source.encode('utf-8')) % 16:add = 16 - (len(source.encode('utf-8')) % 16)
else:add = 0
source = source + ('\0' * add)
print(source)
-
目的:确保明文长度是16字节的倍数,因为AES是分组加密算法,要求数据长度必须是块大小(16字节)的倍数。
- 步骤:
-
计算
source
字符串的字节长度。 -
判断是否需要填充(即长度是否为16的倍数)。
-
如果需要,计算需要填充的字节数,并用
\0
(空字符)进行填充。
-
-
输出:填充后的字符串,例如
'kfc-v50\0\0\0\0\0\0\0\0\0'
。
2. 定义密钥和初始化向量(IV)
key = 'today-is-thursday-kfc-permit-v50'.encode()
mode = AES.MODE_CBC
iv = b'1234567890ABCDEF'
-
密钥(Key):必须是16、24或32字节长。这里使用的是32字节(256位)的密钥。
-
模式(Mode):使用CBC(Cipher Block Chaining)模式,这是最常见的AES加密模式之一。
-
初始化向量(IV):16字节长,用于CBC模式中增加加密的随机性。IV应该是随机生成的,但在示例中使用了固定的值。
3. 加密过程
cryptos = AES.new(key, mode, iv)
cipher = b2a_hex(cryptos.encrypt(source.encode()))
print(cipher.decode())
-
创建AES加密对象:使用指定的密钥、模式和IV初始化AES加密器。
-
加密:将填充后的明文字符串编码为字节并进行加密。
-
转换:将加密后的二进制数据转换为十六进制字符串,便于显示和存储。
-
输出:加密后的十六进制字符串,例如
'e3b0c44298fc1c14...'
。
AES解密部分
1. 定义密钥和IV
key = 'today-is-thursday-kfc-permit-v50'.encode()
mode = AES.MODE_CBC
iv = b'1234567890ABCDEF'
-
解密时使用的密钥、模式和IV必须与加密时完全相同。
2. 解密过程
cryptos = AES.new(key, mode, iv)
dest = cryptos.decrypt(a2b_hex(cipher))
print(dest.decode().rstrip('\0'))
-
创建AES解密对象:同样使用指定的密钥、模式和IV初始化AES解密器。
-
解密:将十六进制字符串转换回二进制数据并进行解密。
-
去除填充:解密后的数据可能包含填充字符
\0
,使用rstrip('\0')
去除这些字符,恢复原始明文。 -
输出:解密后的原始字符串,例如
'kfc-v50'
。
注意事项
-
安全性:
-
固定IV:在实际应用中,IV应该是随机生成的,并且每次加密时都不同。使用固定的IV会降低加密的安全性,特别是在处理大量数据时。
-
密钥管理:确保密钥的安全存储和管理,避免泄露。
-
-
填充方式:
-
示例中使用了
\0
进行填充,这种方式简单但不够通用。推荐使用标准的填充方案,如PKCS7填充,以确保兼容性和安全性。
-
-
异常处理:
-
代码中没有包含异常处理机制。在实际应用中,应添加适当的错误处理,以应对可能的异常情况(例如解密失败、数据格式错误等)。
-
-
依赖库:
- 确保安装了
pycryptodome
库,可以使用以下命令安装:pip install pycryptodome
- 确保安装了
总结
这段代码展示了如何使用Python的pycryptodome
库进行AES加密和解密操作。通过填充明文、定义密钥和IV、执行加密和解密步骤,实现了对称加密的基本流程。然而,在实际应用中,需要注意提高安全性和健壮性,例如使用随机IV、采用标准填充方案以及添加异常处理。
RSA加解密—源码
from binascii import b2a_hex
from binascii import a2b_hex
import rsa# 第一步,生成RSA公和私钥
pub, priv = rsa.newkeys(256)
# print(pub, priv)# 第二步,公钥加密
encrypt = rsa.encrypt('leyinsec'.encode(), pub)
enstr = b2a_hex(encrypt).decode()
# print(enstr)# 第三步,私钥解密
# decrypt = rsa.decrypt(encrypt, priv)
decrypt = rsa.decrypt(a2b_hex(enstr), priv)
print(decrypt.decode())
RSA加解密—源码解析
这段代码使用了Python的rsa
库和binascii
库来实现RSA公钥加密和私钥解密的过程
1. 导入库
from binascii import b2a_hex
from binascii import a2b_hex
import rsa
-
binascii
库用于在二进制和ASCII编码之间转换数据。 -
rsa
库用于实现RSA加密和解密。
2. 生成RSA公钥和私钥
pub, priv = rsa.newkeys(256)
-
使用
rsa.newkeys()
函数生成一对RSA公钥和私钥。 -
参数
256
表示密钥的长度为256位。这是一个相对较短的密钥长度,对于现代安全标准来说可能不够安全。通常建议使用至少3072位的密钥长度。
3. 公钥加密
encrypt = rsa.encrypt('leyinsec'.encode(), pub)
enstr = b2a_hex(encrypt).decode()
-
使用公钥
pub
对字符串'leyinsec'
进行加密。注意,rsa.encrypt()
函数需要字节类型的输入,所以使用.encode()
将字符串转换为字节。 -
加密后的数据是二进制格式,为了方便显示或存储,使用
b2a_hex()
函数将其转换为十六进制字符串。
4. 私钥解密
decrypt = rsa.decrypt(a2b_hex(enstr), priv)
print(decrypt.decode())
-
使用私钥
priv
对加密后的数据进行解密。由于加密后的数据是以十六进制字符串形式存储的,所以首先使用a2b_hex()
函数将其转换回二进制格式。 -
解密后的数据是字节类型,使用
.decode()
将其转换回字符串并打印出来。
注意事项
-
密钥长度:如上所述,256位的RSA密钥长度相对较短,可能不够安全。建议使用更长的密钥长度,如3072位或更长。
-
填充方案:RSA加密通常使用某种填充方案(如PKCS#1 v1.5或OAEP)。在上述代码中,没有明确指定填充方案,因此
rsa
库可能会使用默认的填充方案。在实际应用中,建议明确指定填充方案以确保安全性。 -
错误处理:上述代码没有包含任何错误处理逻辑。在实际应用中,应该添加适当的错误处理来捕获和处理可能发生的异常,如解密失败、无效的输入等。
-
安全性:RSA加密虽然强大,但也有其局限性。它主要用于加密小量数据或用于安全地交换对称加密密钥。对于大量数据的加密,通常建议使用对称加密算法,如AES,并使用RSA来安全地交换对称密钥。
相关文章:
《深入挖掘Python加解密:自定义加密算法的设计与实现》
利用python实现加解密 在正式编写各种加解密前,我们先写个小案例,如下。 封面在文末呦! 基础加解密-源码 # 加密 def encode():source01 乐茵for c in source01:ascii01 ord(c)ascii01 1print(chr(ascii01), end)# 解密 def decode():…...
【前端,TypeScript】TypeScript速成(六):函数
函数 函数的定义 定义一个最简单的加法函数: function add(a: number, b: number): number {return a b }(可以看到 JavaScript/TypeScript 的语法与 Golang 也非常的相似) 调用该函数: console.log(add(2, 3)) // out [LOG…...
Python中元组(tuple)内置的数据类型
在Python中,元组(tuple)是一种内置的数据类型,用于存储不可变的有序元素集合。元组在很多方面与列表(list)相似,但它们之间存在一些关键的区别。以下是关于Python元组的详细解释: 定…...
AI安全的挑战:如何让人工智能变得更加可信
引言 随着人工智能(AI)技术在各个领域的广泛应用,尤其是在医疗、金融、自动驾驶和智能制造等行业,AI正在重塑我们的工作和生活方式。从提高生产效率到实现个性化服务,AI带来了前所未有的便利。然而,在享受这…...
redis用途都有哪些
Redis,作为一个开源的高性能键值对数据库,其用途广泛且功能强大。 1. 缓存(Caching): • Redis常被用作缓存层,存储那些频繁访问但不易改变的数据,如用户会话、商品详情等。 • 通过将这些数据存…...
【Django篇】--动手实现路由模块化与路由反转
一、路由模块化 在一个Django项目中,由于功能类别不同,因此需要将不同功能进行模块化设计。在Django项目中模块化设计则需要将不同模块封装为对应的app模块,每一个模块中涉及到的路由则也需要进行模块化设计,才能更好的让整个项目…...
自研国产零依赖前端UI框架实战008 用户表单以及随机ID
前言 通过前面的努力,我们的组件已经越来越多了,我们的功能也越来越完善. 不过我们的新增用户的功能还没有做. 接下来, 就让我们实现新增用户的功能. 显示新增用户的表单 首先, 我们先把新增用户的表单显示出来. 我们可以复用之前的组件. <zdp_button1 text"新增…...
【数据结构-单调队列】力扣LCR 184. 设计自助结算系统
请设计一个自助结账系统,该系统需要通过一个队列来模拟顾客通过购物车的结算过程,需要实现的功能有: get_max():获取结算商品中的最高价格,如果队列为空,则返回 -1 add(value):将价格为 value …...
项目管理和协作平台Maintainer、Guest、Reporter、Owner 和 Developer 是常见的用户角色
在项目管理和协作平台上,Maintainer、Guest、Reporter、Owner 和 Developer 是常见的用户角色,每个角色有不同的权限和责任。以下是这些角色的详细区别: 1. Guest(访客) 权限:最低级别的权限。访问&#…...
探索电商数据:爬取不同平台商品信息的Python实践
在数字化时代,电商平台的商品信息成为了宝贵的数据资源。除了亚马逊,全球还有许多电商平台的商品信息值得爬取。本文将介绍几个值得关注的电商平台,并提供Python代码示例,展示如何爬取这些平台的商品信息。 1. 京东 (JD.com) 京…...
Autoware Universe 安装记录
前提: ubuntu20.04,英伟达显卡。 演示:https://www.bilibili.com/video/BV1z4CbYFEwr/?spm_id_from333.337.search-card.all.click ROS2-Galactic安装 wget http://fishros.com/install -O fishros && . fishros 选择galactic(R…...
CAT3D: Create Anything in 3D with Multi-View Diffusion Models 论文解读
24年5月的论文,上一版就是ReconFusion 目录 一、概述 二、相关工作 1、2D先验 2、相机条件下的2D先验 3、多视角先验 4、视频先验 5、前馈方法 三、Method 1、多视角扩散模型 2、新视角生成 3、3D重建 一、概述 该论文提出一种CAT3D方法,实现…...
群落生态学研究进展▌Hmsc包对于群落生态学假说的解读、Hmsc包开展单物种和多物种分析的技术细节及Hmsc包的实际应用
HMSC(Hierarchical Species Distribution Models)是一种用于预测物种分布的统计模型。它在群落生态学中的应用广泛,可以帮助科学家研究物种在不同环境条件下的分布规律,以及预测物种在未来环境变化下的潜在分布范围。 举例来说&a…...
C 进阶 — 程序环境和预处理
C 进阶 — 程序环境和预处理 主要内容 程序的编译和执行环境 C 程序编译和链接 预定义符号 预处理指令 #define 预处理指令 #include 预处理指令 #undef 预处理操作符 # 和 ## 宏和函数对比 命令行定义 条件编译 一 程序的编译和执行环境 ANSI C 存在两个不同环境…...
基于单片机的温湿度采集系统(论文+源码)
2.1系统的功能 本系统的研制主要包括以下几项功能: (1)温度检测功能:对所处环境的温度进行检测; (2)湿度检测功能:对所处环境的湿度进行检测; (3)加热和制冷功能:可以完成加热和制冷功能。 (4)加湿和除…...
【数据分析处理之缺失值】
文章目录 一、缺失值的影响1. 统计分析的偏差2. 机器学习模型的性能下降3. 数据质量和可信度下降4. 数据利用率降低5. 增加数据预处理的复杂度 二、识别缺失值1. 使用工具识别缺失值2. 可视化缺失数据 三、处理缺失值的策略1. 删除含缺失值的行或列2. 填充缺失值a. 用常数填充b…...
【大模型实战篇】Mac本地部署RAGFlow的踩坑史
1. 题外话 最近一篇文章还是在11月30日写的,好长时间没有打卡了。最近工作上的事情特别多,主要聚焦在大模型的预训练、微调和RAG两个方面。主要用到的框架是Megatron-DeepSpeed,后续会带来一些分享。今天的文章主要聚焦在RAG。 近期调研了一系…...
SQL Server实现将分组的其他字段数据拼接成一条数据
在 SQL Server 中,可以使用 STRING_AGG 函数(SQL Server 2017 及更高版本支持)将分组的其他字段数据拼接成一条数据。以下是示例代码: 假设有一个表 Orders,结构如下: OrderIDCustomerIDProduct1C001Appl…...
STM32 高级 物联网通讯之蓝牙通讯
目录 蓝牙基础知识 蓝牙概述 蓝牙产生背景 蓝牙发展历程 蓝牙技术类型 经典蓝牙(BR/EDR和AMP) 低功耗蓝牙(BLE) 市场上常见蓝牙架构 SOC蓝牙单芯片方案 SOC蓝牙+MCU方案 蓝牙host+controller分开方案 蓝牙协议栈 蓝牙芯片架构 BLE低功耗蓝牙协议栈框架 物理…...
堆排序基础与实践:如何在Java中实现堆排序
目录 一、堆排序的基本原理 二、堆排序的实现步骤 三、堆排序的时间复杂度和空间复杂度 四、堆排序的工作流程 五、堆排序的优缺点 六、堆排序的应用场景 堆排序(Heap Sort)是一种基于堆数据结构的排序算法。堆是一种特殊的完全二叉树,…...
你有哪些Deep Learning(RNN、CNN)调参的经验?
在深度学习的实践中,调参是一项既艺术又科学的工作。它不仅需要理论知识的支撑,还需要大量的实践经验。以下是一些在RNN和CNN模型调参中积累的经验,希望对正在这个领域摸索的朋友们有所帮助。 1. 从成熟的开源项目开始 对于初学者来说&…...
小程序租赁系统开发的优势与应用探索
内容概要 在如今这个数码科技飞速发展的时代,小程序租赁系统开发仿佛是一张神奇的魔法卡,能让租赁体验变得顺畅如丝。想象一下,无论你需要租用什么,从单车到房屋,甚至是派对用品,只需动动手指,…...
Spring Boot教程之三十九: 使用 Maven 将 Spring Boot 应用程序 Docker 化
如何使用 Maven 将 Spring Boot 应用程序 Docker 化? Docker是一个开源容器化工具,用于在隔离环境中构建、运行和管理应用程序。它方便开发人员捆绑其软件、库和配置文件。Docker 有助于将一个容器与另一个容器隔离。在本文中,为了将Spring B…...
Day58 图论part08
拓扑排序精讲 拓扑排序看上去很复杂,其实了解其原理之后,代码不难 代码随想录 import java.util.*;public class Main{public static void main (String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int m = sc.nextInt();List<List<Integer&…...
u3d中JSON数据处理
一.认识JSON 1.1 Json概述 JSON(JavaScript Object Notation,JavaScript对象表示法)JSON和XML是比较类似的技术,都是用来存储文本信息数据的;相对而言,JSON比XML体积更小巧,但是易读性不如XML…...
大语言模型(LLM)一般训练过程
大语言模型(LLM)一般训练过程 数据收集与预处理 收集:从多种来源收集海量文本数据,如互联网的新闻文章、博客、论坛,以及书籍、学术论文、社交媒体等,以涵盖丰富的语言表达和知识领域。例如,训练一个通用型的LLM时,可能会收集数十亿甚至上百亿字的文本数据.清洗:去除…...
第十六届蓝桥杯模拟赛(第一期)(C语言)
判断质因数 如果一个数p是个质数,同时又是整数a的约数,则p称为a的一个质因数。 请问2024有多少个质因数。 了解 约数,又称因数。整数a整除整数b,b为a的因数(约数)质数,又称素数。只有1和它本身两…...
某网站手势验证码识别深入浅出(全流程)
注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 本文识别已同步上线至OCR识别网站: http://yxlocr.nat300.top/ocr/other/20 本篇文章包含经验和教训总结,我采用了两种方法进行识别,两种方法都各有优劣,其中一…...
QT---------QT框架功能概述
常用Qt界面组件 Qt提供了丰富的界面组件,如QPushButton(按钮)、QLineEdit(单行文本框)、QTextEdit(多行文本框)、QLabel(标签)、QComboBox(下拉框࿰…...
C++ 设计模式:模板方法(Template Method)
链接:C 设计模式 链接:C 设计模式 - 策略模式 链接:C 设计模式 - 观察者模式 模板方法(Template Method)是一种行为设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。通过这…...
下载mysql免安装版和配置
1、下载地址 点击去官网下载https://downloads.mysql.com/archives/community/ 2、解压安装mysql 解压的文件夹是没有my.ini文件和data目录,需要我们自己去创建 根目录下创建my.ini,根目录创建data [mysql] default-character-setutf8[mysqld] #端口 po…...
Web服务端技术原理及应用
前言 黄色的是考点,蓝色的是重点。 HTML/CSS/JS 本章会有一个7分的程序设计题,用到前端知识 form表单元素,常用表单元素 html:HTML快速上手 基础语法、css常用选择器(ID、类)、盒子模型 css:网页美化指南 JS …...
数据库的使用09:使用SSMS工具将SQLsever数据导出到Excel
第一步,新建一个空白的.csv文件 第二步,按步骤点击导出 第三步,选择数据源(Db数据库) 第四步,选择目标源(CSV平面文件目标) 第五步,指定表或SQL 一直点下一步即可&am…...
Python中__getitem__ 魔法方法
在Python中,__getitem__ 是一个特殊的方法,通常称为“魔法方法”或“双下方法”(因为它们的名字前后都有两个下划线)。__getitem__ 方法允许一个对象实现像序列(如列表、元组、字符串)一样的行为࿰…...
自动驾驶三维重建
大概八成估计是未来的科研方向了 Neural Radiance Field in Autonomous Driving: A Survey...
小程序中引入echarts(保姆级教程)
hello hello~ ,这里是 code袁~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 🦁作者简介:一名喜欢分享和记录学习的在校大学生…...
INNER JOIN,LEFT JOIN,RIGHT JOIN,FULL JOIN这四个怎么在gorm中使用
在 GORM 中,JOIN 操作是通过 Joins 方法实现的,而不同类型的 JOIN(如 INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN)可以通过特定的 SQL 语法来表示。GORM 本身并没有直接的 INNER, LEFT, RIGHT 等专用方法,但可以…...
分布式版本管理工具——Git关联远程仓库(github+gitee)
Git远程仓库(Github)的基本使用 一、前言二、Git远程仓库介绍三、演示1. 关联github远程仓库2. 关联gitee(码云)远程仓库3. 重命名远程仓库名4. 移除远程仓库 四、结束语 一、前言 古之立大事者,不惟有超世之才&#x…...
复习打卡大数据篇——HIVE 01
目录 1. 数据仓库初识 1.1 数据仓库概念 1.2 数据仓库特点 1.3 OLTP、OLAP区别 1.4 数仓分层架构 2. HIVE初识 2.1 什么是hive? 2.2 hive架构 3. HIVE初体验 3.1 beeline客户端使用 1. 数据仓库初识 1.1 数据仓库概念 数据仓库,Data WareHou…...
第430场周赛:使每一列严格递增的最少操作次数、从盒子中找出字典序最大的字符串 Ⅰ、统计特殊子序列的数目、统计恰好有 K 个相邻元素的数组数目
Q1、使每一列严格递增的最少操作次数 1、题目描述 给你一个由 非负 整数组成的 m x n 矩阵 grid。 在一次操作中,你可以将任意元素 grid[i][j] 的值增加 1。 返回使 grid 的所有列 严格递增 所需的 最少 操作次数。 2、解题思路 逐列处理:我们需要逐…...
前端处理跨域的几种方式
什么是跨域 指一个域下文档或者脚本去请求另一个域下的资源,这里的跨域是广义的; 广义的跨域: 资源提跳转:A链接、重定向、表单提交资源潜入:link、script、img、frame等dom标签,还有样式中background:url(…...
《计算机网络A》单选题-复习题库
1. 计算机网络最突出的优点是(D) A、存储容量大B、将计算机技术与通信技术相结合C、集中计算D、资源共享 2. RIP 路由协议的最大跳数是(C) A、13B、14C、15D、16 3. 下面哪一个网络层次不属于 TCP/IP 体系模型(D&a…...
网络安全威胁2024年中报告
下载地址: 网络安全威胁2024年中报告-奇安信...
Quartz - JDBC-Based JobStore事务管理及锁机制
由于JDBC-Based JobStore在进行job注册、trigger注册、任务调度及执行过程中需要操作数据库,而且会涉及到多张表,比如trigger注册的时候会根据不同情况写入triggers、simple_triggers或cron_triggers表,在执行任务的时候会读取和更新trigg…...
机器学习作业 | 泰坦尼克号生存的预测任务
泰坦尼克号生存的预测任务 学校作业,我来水一水 环境:pycharmanaconda虚拟环境 文章目录 泰坦尼克号生存的预测任务0.环境搭建参考:1 目的与要求2 任务背景3 任务简介4 模型介绍1.决策树(Decision Tree)2.朴素贝叶斯…...
Tonghttpserver6.0.1.3 使用整理(by lqw)
文章目录 1.声明2.关于单机版控制台和集中管理控制台3.单机版控制台3.1安装,启动和查看授权信息3.2一些常见的使用问题(单机控制台)3.3之前使用的是nginx,现在要配nginx.conf上的配置,在THS上如何配置3.4如何配置密码过…...
图像坐标导数的表达式 Expression for Image Coordinate Derivate
Title: 图像坐标导数的表达式 Expression for Image Coordinate Derivate 文章目录 I. 图像坐标 Image CoordinatesII. 关于 x \mathbf{x} x 的导数 Derivative wrt x \mathbf{x} x1. 第一部分2. 第二部分3. 两部分合并 III. 关于 H H H 的导数 Derivative wrt H H H1. 第一…...
Jenkins 中自动化部署 Spring Boot 项目
👨🏻💻 热爱摄影的程序员 👨🏻🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻🏫 一位高冷无情的全栈工程师 欢迎分享 / 收藏 / 赞 / 在看…...
Live555、FFmpeg、GStreamer介绍
Live555、FFmpeg 和 GStreamer 都是处理流媒体和视频数据的强大开源框架和工具,它们广泛应用于实时视频流的推送、接收、处理和播放。每个框架有不同的设计理念、功能特性以及适用场景。下面将详细分析这三个框架的作用、解决的问题、适用场景、优缺点,并…...
西门子DBX DBD DBB DBW的关系
DB10.DBD0 DB10.DBW0DB10.DBW2 DB10.DBB0DB10.DBB1DB10.DBB2DB10.DBB3 DB10.DBX0.00.7DB10.DBX1.01.7DB10.DBX2.02.7DB10.DBX3.03.7 使用之前需要在DB10中先定义,如果你仅在DB10中定义了一个DBD0,那么原则上你是可以使用上述所有地址的,但…...