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

对称加密算法DES的实现

一、实验目的

1、了解对称密码体制基本原理

2、掌握编程语言实现对称加密、解密

二、实验原理

       DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环,使用异或,置换,代换,移位操作四种基本运算。DES算法的入口参数有三个:Key、Data、Mode。Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。

三、实验代码

class DES():# 初始化DES加密的参数def __init__(self,key: str):# 初始数据置换表IP,用于初始IP置换self.IP = [58, 50, 42, 34, 26, 18, 10, 2,60, 52, 44, 36, 28, 20, 12, 4,62, 54, 46, 38, 30, 22, 14, 6,64, 56, 48, 40, 32, 24, 16, 8,57, 49, 41, 33, 25, 17, 9, 1,59, 51, 43, 35, 27, 19, 11, 3,61, 53, 45, 37, 29, 21, 13, 5,63, 55, 47, 39, 31, 23, 15, 7,]# 密钥初始置换表PC_1,用于获得最初的56位密钥self.PC_1 = [57, 49, 41, 33, 25, 17, 9,1, 58, 50, 42, 34, 26, 18,10, 2, 59, 51, 43, 35, 27,19, 11, 3, 60, 52, 44, 36,63, 55, 47, 39, 31, 23, 15,7, 62, 54, 46, 38, 30, 22,14, 6, 61, 53, 45, 37, 29,21, 13, 5, 28, 20, 12, 4,]# 密钥压缩置换表PC_2,用于获得子密钥self.PC_2 = [14, 17, 11, 24, 1, 5, 3, 28,15, 6, 21, 10, 23, 19, 12, 4,26, 8, 16, 7, 27, 20, 13, 2,41, 52, 31, 37, 47, 55, 30, 40,51, 45, 33, 48, 44, 49, 39, 56,34, 53, 46, 42, 50, 36, 29, 32,]# 密钥每一轮的对应左移位数self.k0 = [1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, ]# E扩展表,用于将右半部分数据Rn从32位置换成48位self.E = [32, 1, 2, 3, 4, 5,4, 5, 6, 7, 8, 9,8, 9, 10, 11, 12, 13,12, 13, 14, 15, 16, 17,16, 17, 18, 19, 20, 21,20, 21, 22, 23, 24, 25,24, 25, 26, 27, 28, 29,28, 29, 30, 31, 32, 1,]# S盒,将48位数据代替为32位数据self.S = [[14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13,],[15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,],[10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12,],[7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14,],[2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3,],[12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13,],[4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12,],[13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11,],]# P盒置换表,S盒代替运算的32位输出按照P盒进行置换self.P = [16, 7, 20, 21,29, 12, 28, 17,1, 15, 23, 26,5, 18, 31, 10,2, 8, 24, 14,32, 27, 3, 9,19, 13, 30, 6,22, 11, 4, 25,]# 最终置换表IP_1,用于逆置换self.IP_1 = [40, 8, 48, 16, 56, 24, 64, 32,39, 7, 47, 15, 55, 23, 63, 31,38, 6, 46, 14, 54, 22, 62, 30,37, 5, 45, 13, 53, 21, 61, 29,36, 4, 44, 12, 52, 20, 60, 28,35, 3, 43, 11, 51, 19, 59, 27,34, 2, 42, 10, 50, 18, 58, 26,33, 1, 41, 9, 49, 17, 57, 25,]# 设置密钥self.K = self.convert_to_2(key)# 进制转换——字符串转为二进制def convert_to_2(self, string: str) -> str:# 将字符串转成bytes类型,再转成liststr_list = list(bytes(string, 'utf8'))result = []for num in str_list:# 用bin(num)将当前字节转换为二进制,然后使用[2:]切片操作去掉二进制字符串前面的"0b"标识。# 用zfill(8)函数给二进制字符串添加前导零,确保二进制字符串长度为8位# 一个字节由8个二进制位组成,保持一致性result.append(bin(num)[2:].zfill(8))# 将结果列表中的所有二进制字符串连接return "".join(result)# 进制转换——二进制转成字符串def convert_to_str(self, binary: str) -> str:# 将二进制字符串分组,每8位为一组bin_list = [binary[i:i + 8] for i in range(0, len(binary), 8)]# 存储每个8位二进制数字所代表的整数值list_int = []for b in bin_list:# 将当前8位二进制数转换为对应的十进制整数list_int.append(int(b, 2))# 将整数列表转换为字节序列,再解码得到字符串result = bytes(list_int).decode()return result# 对明文二进制进行分块,每64位为一块def get_block(self, binary: str) -> list:# 首先获取给定二进制字符串的长度len_binary = len(binary)if len_binary % 64 != 0:# 如果不能整除,说明按每64块分块不能刚好分块,需要添加前导零。new_binary = ("0" * (64 - (len_binary % 64))) + binary# 分块return [new_binary[i:i + 64] for i in range(0, len(new_binary), 64)]else:# 能被64整除,就不用补零,直接分块return [binary[j:j + 64] for j in range(0, len(binary), 64)]# 按照给定的置换表进行置换def replace(self, table: str, replace_table: list) -> str:new_table = ""for i in replace_table:# 因为列表的索引是从0开始的,而替换表中的位置索引是从1开始的,所以需要进行减1的操作。new_table += table[i - 1]return new_table# 返回加密过程中16轮的子密钥def get_sonkey(self):# 56位密钥由密钥初始置换表(PC_1)置换默认密钥获得key = self.replace(self.K, self.PC_1)# 将56位的密钥分成两部分,每部分28位left_key = key[0:28]right_key = key[28:56]# 存储子密钥keys = []for i in range(0, 16):# 由轮换表确定当前轮次的移动次数move = self.k0[i]# 对左右部分分别进行移位操作move_left = left_key[move:28] + left_key[0:move]move_right = right_key[move:28] + right_key[0:move]# 更新left_key和right_keyleft_key = move_leftright_key = move_right# 合并形成当前轮次的子密钥move_key = left_key + right_key# 按照密钥压缩置换表(PC_2)进行置换,得到长度为48位的子密钥ki,并将其添加到keys列表中。ki = self.replace(move_key, self.PC_2)keys.append(ki)# 返回加密过程中的16轮子密钥。return keys# 异或操作def xor(self, xor1: str, xor2: str):size = len(xor1)result = ""for i in range(0, size):result += '0' if xor1[i] == xor2[i] else '1'return result# S盒代替def s_box(self, xor_result: str):result = ""# 迭代8轮,每轮处理6位二进制数据for i in range(0, 8):# 将48位数据分为8组,循环进行block = xor_result[i * 6:(i + 1) * 6]# 首尾比特得行数line = int(block[0] + block[5], 2)# 中间四位比特得列数column = int(block[1:5], 2)# 在S盒中查找,将所得转为二进制并通过[2:]切片去除二进制字符串的前缀"0b"res = bin(self.S[i][line * column])[2:]if len(res) < 4:# 如果结果的长度不足4位,则在左边用'0'进行填充res = '0' * (4 - len(res)) + resresult += res# result中存储了经过S盒替换后的32位二进制数据return result# F函数,进行E扩展,与key异或操作,S盒替代及P盒置换操作后返回32位01字符串def F_function(self, right: str, key: str):# 对right进行E扩展e_result = self.replace(right, self.E)# 与key 进行异或操作xor_result = self.xor(e_result, key)# 进入S盒子s_result = self.s_box(xor_result)# 进行P置换p_result = self.replace(s_result, self.P)return p_result# 16轮迭代加密def iteration(self, bin_plaintext: str, key_list: list):# 分组切分left = bin_plaintext[0:32]right = bin_plaintext[32:64]for i in range(0, 16):# L(n) = R(n-1)# R(n) = L(n-1)⊕F(R(n-1),K(n))next_left = rightf_result = self.F_function(right, key_list[i])next_right = self.xor(left, f_result)left = next_leftright = next_right# 最后R在左边,L在右边return right + left# DES加密函数def encrypt(self, plaintext):# 将给定明文转换为二进制plaintext_2 = self.convert_to_2(plaintext)# 将二进制明文分为64位一组的块plaintext_block = self.get_block(plaintext_2)# 存储加密后的分组ciphertext_block = []# 获取生成的16个子密钥列表key_list = self.get_sonkey()for block in plaintext_block:# 初代IP置换replaced_IP = self.replace(block, self.IP)# 16轮迭代操作ite_result = self.iteration(replaced_IP, key_list)# 逆IP置换replaced_IP_1 = self.replace(ite_result, self.IP_1)# 密文块replaced_IP_1添加到ciphertext_block列表中,以便后续拼接ciphertext_block.append(replaced_IP_1)ciphertext = ''.join(ciphertext_block)return ciphertext#DES解密函数def decrypt(self, ciphertext):# 存储解密后的分组plaintext_block = []# 获取生成的16个子密钥列表key_list = self.get_sonkey()# 解密时密钥的使用顺序与加密时的顺序应当相反。key_list = key_list[::-1]# 将二进制密文分为64位一组的块ciphertext_block = [ciphertext[i:i + 64] for i in range(0, len(ciphertext), 64)]for block in ciphertext_block:# 初代IP置换replaced_IP = self.replace(block, self.IP)# 16轮迭代操作ite = self.iteration(replaced_IP, key_list)# 逆IP置换replaced_IP_1 = self.replace(ite, self.IP_1)# 明文块replaced_IP_1添加到plaintext_block列表中,以便后续拼接plaintext_block.append(replaced_IP_1)# 拼接,并移除其中的所有全零块。# 消除加密过程中可能引入的填充块,使得最终的二进制明文表示更加紧凑和直观。plaintext = ''.join(plaintext_block).replace('00000000', '')# 将二进制明文转为字符串返回return self.convert_to_str(plaintext)def main():#select = input("输入1加密;输入2解密;输入3退出程序;请输入:\n")while True:select = input("输入1加密;输入2解密;输入3退出程序;请输入:\n")if select == '1':plaintext = input("输入要加密的明文:")key = input("输入要加密的密钥:")des = DES(key)  # 创建DES对象时传入密钥ciphertext = des.encrypt(plaintext)print("加密得:{}".format(ciphertext))elif select == '2':ciphertext = input("输入要解密的密文:")key = input("输入要解密的密钥:")des = DES(key)  # 创建DES对象时传入密钥plaintext = des.decrypt(ciphertext)print("解密得:{}".format(plaintext))elif select == '3':breakelse:print("重新选择!")select = input("输入1加密;输入2解密;输入3退出程序;请输入:\n")  # 重新获取选择if __name__ == '__main__':main()

 四、运行结果

相关文章:

对称加密算法DES的实现

一、实验目的 1、了解对称密码体制基本原理 2、掌握编程语言实现对称加密、解密 二、实验原理 DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位&#xff0c;产生最大 64 位的分组大小。这是一个迭代的分组密码&#xff0c;使用称为 Feistel 的技术&#xff0c;其中将加密…...

Spring Boot 启动时修改上下文

Spring Boot 启动时修改上下文 为了让项目在启东时&#xff0c;加载到封装的JAR中的国际化文件在封装JAR是增加以下配置类可用于更改启动上下文中的信息依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoco…...

传奇996_19——常用函数

打印 打印到公告 lua版 sendmsg(*actor*, ConstCfg.notice.own, {"Msg":"<font color\#ff0000\>即将更新属性2222&#xff01;&#xff01;&#xff01;</font>","Type":9}) sendmsg(*actor*, 1, {"Msg":"<fon…...

计算机毕业设计Python+Neo4j知识图谱医疗问答系统 大模型 机器学习 深度学习 人工智能 大数据毕业设计 Python爬虫 Python毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

【Python】如何设置VSCode中的Pylint,消除各种没有必要的警告

前言 最近打开VSCode&#xff0c;编辑之前创建的Python项目&#xff0c;突然发现多了一堆报错和警告&#xff0c;如下图所示。 就非常吓人&#xff0c;因为之前这个项目是没有任何报错的&#xff0c;我赶紧试着运行了一下&#xff0c;还好&#xff0c;可以正常运行&#xff0c;…...

游戏引擎学习第14天

视频参考:https://www.bilibili.com/video/BV1iNUeYEEj4/ 1. 为什么关注内存管理&#xff1f; 内存分配是潜在的失败点&#xff1a; 每次进行内存分配&#xff08;malloc、new等&#xff09;时&#xff0c;都可能失败&#xff08;例如内存不足&#xff09;。这种失败会引入不稳…...

关于mysql中的锁

mysql中包含的锁分为&#xff1a; 一、全局锁 二、表锁 三、行锁 一、全局锁 全局锁的力度是最大的&#xff0c;全局锁对整个数据库实例加锁&#xff0c;加锁后整个实例就处于只读状态&#xff0c;后续的DML的写语句&#xff0c;DDL语句&#xff0c;已经更新操作的事务提交语句…...

机器学习-4:机器学习的建模流程

机器学习的建模流程 流程为&#xff1a; 原始数据 --> 数据预处理 --> 特征工程 --> 建模 --> 验证。 原始数据收集 所有AI或机器学习的基础就是数据&#xff0c;没有数据就什么都做不了&#xff0c;在搭建一个系统之前首要考虑的就是有没有足够多的数据可以支撑这…...

Android 6年经验面试总结 2024.11.15

背景&#xff1a;深圳 面过12家中大厂、4家中小厂&#xff0c;通过4家中大厂&#xff0c;2家offer。 针对六年的求职面试总结&#xff1a;项目经验70%30%基础&#xff08;基础应该必会&#xff09; 对于上来就问八股文的公司&#xff0c;对于已经工作了5年以上的开发来说&…...

R语言数据分析可视化——summarytools包的使用

R语言中的summarytools包通过提供能够用最少的代码生成数据全面摘要的功能,使数据分析更加简单。summarytools包提供了一种简单的方法来生成数据集的摘要统计信息,包括描述性统计、频率表、交叉表、缺失值、异常值、相关性、线性回归、ANOVA、卡方检验等。本文将介绍如何使用…...

转型一年半,虎牙直播的第二增长曲线喜忧参半

文&#xff1a;互联网江湖 作者&#xff1a;刘致呈 最近&#xff0c;虎牙公司&#xff08;NYSE:HUYA&#xff09;公布了2024年第三季度财报。 表现怎么样呢&#xff1f;从财务数据上看&#xff0c;这份成绩单有点不尽人意。 报告期内&#xff0c;虎牙实现营收15.38亿元&…...

makefile笔记

makefile 在 Makefile 中&#xff0c;预定义的变量&#xff08;也称为内置变量&#xff09;提供了对构建过程中的默认值和特殊值的访问。这些变量通常由 Make 自动设置&#xff0c;并且可以覆盖它们以改变 Make 的行为。下面是 Make 环境中常见的几个内置变量及其用途&#xf…...

Rewar Model的输出(不包含训练)

这里写自定义目录标题 介绍模型推理的输出过程方案原始Token输出RM输出&#xff08;回归任务&#xff09; 介绍 奖励函数模型 (Reward Model) 是人工智能 (AI) 中的一种方法&#xff0c;模型因其对给定提示的响应而获得奖励或分数。现在的文章清一色的讲解RM的训练&#xff0c…...

Python调用API翻译Excel中的英语句子并回填数据

一、问题描述 最近遇到一个把Excel表中两列单元格中的文本读取&#xff0c;然后翻译&#xff0c;再重新回填到单元格中的案例。大约有700多行&#xff0c;1400多个句子&#xff0c;一个个手动复制粘贴要花费不少时间&#xff0c;而且极易出错。这时&#xff0c;我们就可以请出…...

SQL面试题——抖音SQL面试题 最大在线用户数

最大在线用户数 下面的数据记录了一个直播平台上用户进入平台和离开平台的情况 +---+-------------------+-----+ | id| etime| type| +---+-------------------+-----+ | 1|2021-06-10 10:00:00|enter| | 1|2021-06-10 19:00:00|leave| | 2|2021-06-10 11:0…...

前端知识点---Window对象(javascript)了解

Window对象 在JavaScript中&#xff0c;当你在非严格模式下的全局作用域中使用this时&#xff0c;它会引用全局对象。在浏览器环境中&#xff0c;这个全局对象就是Window。 01什么是 Window 对象&#xff1f; Window 是浏览器提供的一个全局对象&#xff0c;它代表了浏览器的…...

llama factory lora 微调 qwen2.5 7B Instruct模型

项目背景 甲方提供一台三卡4080显卡 需要进行qwen2.5 7b Instruct模型进行微调。以下为整体设计。 要使用 LLaMA-Factory 对 Qwen2.5 7B Instruct模型 进行 LoRA&#xff08;Low-Rank Adapters&#xff09;微调&#xff0c;流程与之前提到的 Qwen2 7B Instruct 模型类似。LoRA …...

类和对象——拷贝构造函数,赋值运算符重载(C++)

1.拷⻉构造函数 如果⼀个构造函数的第⼀个参数是自身类类型的引用&#xff0c;且任何额外的参数都有默认值&#xff0c;则此构造函数也叫做拷贝构造函数&#xff0c;也就是说拷贝构造是⼀个特殊的构造函数。 // 拷贝构造函数//d2(d1) Date(const Date& d) {_year d._yea…...

Android 关于使用videocompressor库压缩没有声音和异常的问题

原库地址 https://gitcode.com/gh_mirrors/vi/VideoCompressor/overview 这个库用起来比较方便&#xff0c;使用Android原生的MediaCodecmp4parser的方式进行压缩&#xff0c;不用接入so库也不用适配cpu 问题 接口库后你会发现过时了&#xff0c;所以你一阵捣鼓后你发现压缩…...

LeetCode-215.数组中的第K个最大元素

. - 力扣&#xff08;LeetCode&#xff09;给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问…...

『OpenCV-Python』视频的读取和保存

点赞 + 关注 + 收藏 = 学会了 推荐关注 《OpenCV-Python专栏》 上一讲介绍了 OpenCV 的读取图片的方法,这一讲简单聊聊 OpenCV 读取和保存视频。 视频的来源主要有2种,一种是本地视频文件,另一种是实时视频流,比如手机和电脑的摄像头。 要读取这两种视频的方法都是一样的…...

什么是Spring Boot Actuator

Spring Boot Actuator是一个用于监控和管理Spring Boot应用的框架&#xff0c;它提供了生产级别的功能&#xff0c;如健康检查、审计、指标收集、HTTP跟踪等。以下是对Spring Boot Actuator的详细介绍&#xff1a; 一、主要功能和特点 监控和管理&#xff1a; 提供多种内置端点…...

计算机网络:运输层 —— 运输层端口号

文章目录 运输层端口号的分类端口号与应用程序的关联应用举例发送方的复用和接收方的分用 运输层端口号的分类 端口号只具有本地意义&#xff0c;即端口号只是为了标识本计算机网络协议栈应用层中的各应用进程。在因特网中不同计算机中的相同端口号是没有关系的&#xff0c;即…...

linux下编译安装memcached

一、安装依赖库 Memcached依赖于一些系统库&#xff0c;在大多数Linux发行版中&#xff0c;需要安装libevent库。 Debian/Ubuntu系统 使用以下命令安装依赖库&#xff1a; sudo apt -y update sudo apt -y install libevent - devCentOS/RHEL系统 可以通过以下命令安装&am…...

最短路径生成树的数量-黑暗城堡

信息学奥赛一本通T1486-黑暗城堡 时间限制: 2s 内存限制: 192MB 提交: 18 解决: 9 题目描述 知道黑暗城堡有 N 个房间&#xff0c;M 条可以制造的双向通道&#xff0c;以及每条通道的长度。 城堡是树形的并且满足下面的条件&#xff1a; 设 Di为如果所有的通道都被修建&#xf…...

将已有的MySQL8.0单机架构变成主从复制架构

过程: 把数据库做一个完全备份, 恢复到从节点上, 恢复后从备份的那个点开始往后复制,从而保证后续数据的一致性。 步骤: 修改 master 主节点 的配置&#xff08; server-id log-bin &#xff09;master 主节点 完全备份&#xff08; mysqldump &#xff09;master 主节点 创建…...

JSON.stringify的应用说明

前言 JSON.stringify() 方法将 JavaScript 对象转换为字符串,在日常开发中较常用&#xff0c;但JSON.stringify其实有三个参数&#xff0c;后两个参数&#xff0c;使用较少&#xff0c;今天来介绍一下后两个参数的使用场景和示例。 语法及参数说明 JSON.stringify()&#xf…...

pyflink datastream数据流ds经过一系列转换后转为table,t_env.from_data_stream(ds)

在 pyflink 处理数据流过程中&#xff0c;有时候需要将data_stream转为table,下面是正确的方式&#xff0c;即每一个算子(map&#xff0c;reduce, window)操作之后需要指定输出数据类型。 from pyflink.common.typeinfo import Types from pyflink.datastream import StreamEx…...

vxe-grid table 校验指定行单元格的字段,只校验某个列的字段

Vxe UI vue vxe-table 中校验表格行是非常简单的&#xff0c;只需要配置好校验规则&#xff0c;然后调用 validate 方法就可以自动完成校验&#xff0c;但是由于项目淡色特殊需求&#xff0c;在某个单元格的值修改后需要对另一个列的值就行校验&#xff0c;这个时候又不需要全部…...

【Java多线程】单例模式(饿汉模式和懒汉模式)

目录 单例模式的定义&#xff1a; 饿汉式--单例模式 定义&#xff1a; 案例&#xff1a; 优缺点&#xff1a; 懒汉式--单例模式&#xff1a; 定义&#xff1a; 1&#xff09;懒汉式单例模式&#xff08;非线程安全&#xff09; 2&#xff09;线程安全的懒汉式单例模…...