调用openssl实现加解密算法
由于工作中涉及到加解密,包括Hash(SHA256)算法、HMAC_SHA256 算法、ECDH算法、ECC签名算法、AES/CBC 128算法一共涉及5类算法,笔者通过查询发现openssl库以上算法都支持,索性借助openssl库实现上述5类算法。笔者用的openssl库版本为 OpenSSL 1.1.1k 。
Hash(SHA256)算法
算法代码如下:
#include <openssl/sha.h>
#include <iostream>
#include <iomanip>
#include <sstream>
#include <vector>// 将字节数组转换为十六进制字符串
// 将字节数组转换为十六进制字符串
std::string bytesToHex(const unsigned char* bytes, size_t length) {std::stringstream ss;ss << std::hex << std::setfill('0');for (size_t i = 0; i < length; ++i) {ss << std::setw(2) << (int)bytes[i];}return ss.str();
}int main() {// 原数据const std::string data = "6572B36A91E28FB900134C3010C445437DC04D04";// 创建一个SHA256上下文SHA256_CTX sha256;SHA256_Init(&sha256);// 更新上下文以包含要哈希的数据SHA256_Update(&sha256, data.c_str(), data.size());// 计算哈希值unsigned char hash[SHA256_DIGEST_LENGTH];SHA256_Final(hash, &sha256);// 将哈希值转换为十六进制字符串并输出std::string hashHex = bytesToHex(hash, SHA256_DIGEST_LENGTH);std::cout << "SHA256 hash: " << hashHex << std::endl;return 0;
}
运行结果如下:
HMAC_SHA256 算法
算法代码如下:
#include <openssl/hmac.h>
#include <iostream>
#include <iomanip>
#include <sstream>
#include <cstring>// 将字节数组转换为十六进制字符串
std::string bytesToHex(const unsigned char* bytes, size_t length) {std::stringstream ss;ss << std::hex << std::setfill('0');for (size_t i = 0; i < length; ++i) {ss << std::setw(2) << (int)bytes[i];}return ss.str();
}int main() {// 要进行HMAC的数据const std::string data = "374D34303534424E39323330351000FFFFFFFFFF";// HMAC的密钥const std::string key = "c0df3585876ac6bb02bf6347b3654993";// 输出缓冲区unsigned char* hmacResult = new unsigned char[EVP_MAX_MD_SIZE];unsigned int hmacLen = 0;// 使用HMAC_SHA256进行计算HMAC_CTX* hmacCtx = HMAC_CTX_new();HMAC_Init_ex(hmacCtx, key.data(), key.size(), EVP_sha256(), NULL);HMAC_Update(hmacCtx, (unsigned char*)data.data(), data.size());HMAC_Final(hmacCtx, hmacResult, &hmacLen);// 将HMAC结果转换为十六进制字符串并输出std::string hmacHex = bytesToHex(hmacResult, hmacLen);std::cout << "HMAC_SHA256: " << hmacHex << std::endl;// 清理资源HMAC_CTX_free(hmacCtx);delete[] hmacResult;return 0;
}
执行结果如下:
ECDH算法
这个算法没有找到网页端的在线工具验证,但是笔者根据我们这次给的案例验证如下:
笔者感觉上述给的最终生成的会话秘钥应该有问题,生成的会话秘钥应该是256bit。
算法代码如下:
#include <openssl/ec.h>
#include <openssl/bn.h>
#include <openssl/pem.h>
#include <iostream>
#include <iomanip>
#include <sstream>using namespace std;// 辅助函数,用于将十六进制字符串转换为 BIGNUM
BIGNUM* hex_to_BN(const std::string& hex) {BIGNUM* bn = BN_new();if (!BN_hex2bn(&bn, hex.c_str())) {BN_free(bn);throw std::runtime_error("Failed to convert hex to BIGNUM");}return bn;
}// 辅助函数,用于打印会话密钥
void print_session_key(const unsigned char* key, size_t key_len) {std::stringstream ss;ss << "Session Key: ";for (size_t i = 0; i < key_len; ++i) {ss << std::hex << std::setw(2) << std::setfill('0') << (int)key[i];}std::cout << ss.str() << std::endl;
}int main() {// 私钥十六进制串std::string privateKeyHex = "5904507894591f4b39308a51d5e2e25566a66366b1d6d952fba17de3af19235f";// 对端公钥十六进制串std::string publicKeyHex = "04fef2f1a2a0df9f75cda6e36268b7f62749cae378b7a5b9f311add58beaeadf3e49e41ac2acede766a21feaf354119f70ec3587f1054a1286ba08a1d866ef40ed";// 创建 EC_KEY 对象,使用 secp256r1 曲线EC_KEY* eckey = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);if (!eckey) {std::cerr << "Error creating EC key with secp256r1 curve" << std::endl;return 1;}// 设置私钥BIGNUM* privateKeyBN = hex_to_BN(privateKeyHex);if (!EC_KEY_set_private_key(eckey, privateKeyBN)) {std::cerr << "Error setting private key" << std::endl;BN_free(privateKeyBN);EC_KEY_free(eckey);return 1;}BN_free(privateKeyBN); // EC_KEY_set_private_key 会复制 BN,所以可以安全释放// 解析对端公钥const EC_GROUP* group = EC_KEY_get0_group(eckey);EC_POINT* pubKeyPoint = EC_POINT_new(group);if (!EC_POINT_hex2point(group, publicKeyHex.c_str(), pubKeyPoint, NULL)) {std::cerr << "Error parsing public key" << std::endl;EC_POINT_free(pubKeyPoint);EC_KEY_free(eckey);return 1;}// 执行 ECDH 密钥交换unsigned char* session_key1 = (unsigned char*)OPENSSL_malloc(32);if (session_key1 == NULL) {std::cerr << "Error allocating memory for session keys" << std::endl;OPENSSL_free(session_key1);EC_KEY_free(eckey);return 1;}int ret = ECDH_compute_key(session_key1, 32, pubKeyPoint, eckey, NULL);if (ret < 0) {std::cerr << "Error computing shared secret" << std::endl;OPENSSL_free(session_key1);EC_POINT_free(pubKeyPoint);EC_KEY_free(eckey);return 1;}// 将共享密钥转换为十六进制字符串并打印print_session_key(session_key1, 32);// 清理资源OPENSSL_free(session_key1);EC_POINT_free(pubKeyPoint);EC_KEY_free(eckey);return 0;
}
执行结果为:
ECC签名算法
算法代码如下:
#include <openssl/ec.h>
#include <openssl/ecdsa.h>
#include <openssl/obj_mac.h>
#include <openssl/sha.h>
#include <openssl/evp.h>
#include <openssl/bn.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#include <iostream>
#include <vector>
#include <cstring>// 将十六进制字符串转换为字节数组
std::vector<unsigned char> hex2bytes(const std::string& hex) {std::vector<unsigned char> bytes;for (size_t i = 0; i < hex.length(); i += 2) {std::string byteString = hex.substr(i, 2);unsigned char byte = (unsigned char) strtol(byteString.c_str(), nullptr, 16);bytes.push_back(byte);}return bytes;
}// 验证ECDSA签名
bool verify_ecdsa_signature(const std::string& public_key_hex, const std::string& data_hex, const std::string& signature_hex) {// 将十六进制字符串转换为字节数组std::vector<unsigned char> public_key_bytes = hex2bytes(public_key_hex);std::vector<unsigned char> data_bytes = hex2bytes(data_hex);std::vector<unsigned char> signature_bytes = hex2bytes(signature_hex);// 创建EC_KEY对象EC_KEY* ec_key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);if (!ec_key) {std::cerr << "Failed to create EC_KEY" << std::endl;return false;}// 从字节数组中解析公钥const unsigned char* p = public_key_bytes.data();ec_key = o2i_ECPublicKey(&ec_key, &p, public_key_bytes.size());if (!ec_key) {std::cerr << "Failed to parse public key" << std::endl;EC_KEY_free(ec_key);return false;}// 计算数据的哈希值(假设使用SHA-256)unsigned char hash[SHA256_DIGEST_LENGTH];SHA256_CTX sha256;SHA256_Init(&sha256);SHA256_Update(&sha256, data_bytes.data(), data_bytes.size());SHA256_Final(hash, &sha256);// 验证签名ECDSA_SIG* ec_sig = ECDSA_SIG_new();const unsigned char* sig = signature_bytes.data();ec_sig = d2i_ECDSA_SIG(&ec_sig, &sig, signature_bytes.size());if (!ec_sig) {std::cerr << "Failed to parse signature" << std::endl;EC_KEY_free(ec_key);return false;}int verify_result = ECDSA_do_verify(hash, SHA256_DIGEST_LENGTH, ec_sig, ec_key);if (verify_result != 1) {std::cerr << "Signature verification failed" << std::endl;ECDSA_SIG_free(ec_sig);EC_KEY_free(ec_key);return false;}// 释放资源ECDSA_SIG_free(ec_sig);EC_KEY_free(ec_key);return true;
}int main() {// 公钥、数据和签名的十六进制字符串std::string public_key_hex = "0467BF4978CB114972AE0AF84E22FD4099D1FF045F88830C41D9AC5CC4B4EBA17F8D1AB65884368BD47E1EF8A28A33EEE92BB6409AFB5217E0F120866B85913E0B";std::string data_hex = "03";std::string signature_hex = "3044022023FAE603D8A64BF004DCC56BCFD904F2E2E4AFCBD9DDF1F2C6F4EE1A4D7A1F3C0220708D8D63FBCD6BCA61B8827280F628074759C77104952307DD9C407F5B0B2C2D";// 验证签名bool is_valid = verify_ecdsa_signature(public_key_hex, data_hex, signature_hex);if (is_valid) {std::cout << "Signature is valid" << std::endl;} else {std::cout << "Signature is invalid" << std::endl;}return 0;
}
执行结果如下:
AES/CBC128算法
算法代码如下:
#include <openssl/aes.h>
#include <iostream>
#include <cstring>// 假设你的数据长度总是16字节的倍数
void aes_cbc_128_encrypt_nopadding(const unsigned char* key, unsigned char* iv,const unsigned char* input, unsigned char* output, size_t length) {AES_KEY aesKey;AES_set_encrypt_key(key, 256, &aesKey); // 设置256位AES加密密钥// 由于我们假设输入数据长度是16字节的倍数,我们可以直接加密for (size_t i = 0; i < length; i += AES_BLOCK_SIZE) {AES_cbc_encrypt(input + i, output + i, AES_BLOCK_SIZE, &aesKey, iv, AES_ENCRYPT);// 更新IV,对于CBC模式,每个块的IV是上一个块的密文std::memcpy(iv, output + i, AES_BLOCK_SIZE);}
}// 解密函数,使用256位AES密钥和CBC模式
void aes_cbc_128_decrypt_nopadding(const unsigned char* key, const unsigned char* iv,const unsigned char* input, unsigned char* output, size_t length) {AES_KEY aesKey;AES_set_decrypt_key(key, 256, &aesKey);// 在CBC模式下,解密时需要一个临时的IV,因为它会在解密过程中被更新unsigned char temp_iv[AES_BLOCK_SIZE];std::memcpy(temp_iv, iv, AES_BLOCK_SIZE);for (size_t i = 0; i < length; i += AES_BLOCK_SIZE) {AES_cbc_encrypt(input + i, output + i, AES_BLOCK_SIZE, &aesKey, temp_iv, AES_DECRYPT);// 更新临时IV为下一个块的密文(实际上是上一个块的明文)std::memcpy(temp_iv, input + i, AES_BLOCK_SIZE);}
}// 将十六进制字符串转换为字节数组
std::string hex2str(const std::string& hex) {std::string retStr;for (size_t i = 0; i < hex.length(); i += 2) {std::string byteString = hex.substr(i, 2);unsigned char byte = (unsigned char) strtol(byteString.c_str(), nullptr, 16);retStr += byte;}return retStr;
}int main() {// 256位(32字节)的AES密钥const std::string keyhex = "c5ba9981452fa728a10794730919aaa747ca54df2f21fab685bbd0fdb53f05fb";const std::string keystr = hex2str(keyhex);// 初始化向量(IV),需要与密钥长度相同,即16字节unsigned char iv[AES_BLOCK_SIZE] = {0x00};// 要加密的数据(确保长度是16字节的倍数)const std::string plaintexthex = "313131313131313131313131313131313232323232323232323232323232323230450221009F9B7BC16546FDFA85866AFE2761FAF6C1B018C99E6B7C6339FF47BA126E01990220558339565F469C3AD4EBA77AEE5C22C7C464449D6395FBC1158F1B589569336980000000000000000000000000000000000000000000000000";const std::string plaintext = hex2str(plaintexthex); // 正好是16字节unsigned char input[plaintext.size()], key[2 * AES_BLOCK_SIZE];std::copy(plaintext.begin(), plaintext.end(), input);std::copy(keystr.begin(), keystr.end(), key);// 输出缓冲区unsigned char output[plaintext.size()];unsigned char in2put[plaintext.size()];// 调用加密函数aes_cbc_128_encrypt_nopadding(key, iv, input, output, plaintext.size());// 输出加密后的数据(以十六进制形式)std::cout << "加密数据 :";for (size_t i = 0; i < plaintext.size(); ++i) {printf("%02x", output[i]);}std::cout << std::endl;memset(iv, 0, AES_BLOCK_SIZE);// 调用解密函数aes_cbc_128_decrypt_nopadding(key, iv, output, in2put, plaintext.size());// 输出加密后的数据(以十六进制形式)std::cout << "解密数据 :";for (size_t i = 0; i < plaintext.size(); ++i) {printf("%02x", in2put[i]);}std::cout << std::endl;return 0;
}
执行结果如下:
相关文章:
调用openssl实现加解密算法
由于工作中涉及到加解密,包括Hash(SHA256)算法、HMAC_SHA256 算法、ECDH算法、ECC签名算法、AES/CBC 128算法一共涉及5类算法,笔者通过查询发现openssl库以上算法都支持,索性借助openssl库实现上述5类算法。笔者用的op…...
【Python项目】信息安全领域中语义搜索引擎系统
【Python项目】信息安全领域中语义搜索引擎系统 技术简介:采用Python技术、MYSQL数据库等实现。 系统简介:系统主要是围绕着语义搜索展开的,要将输入的文字在爬取数据时能够通过深层次的内涵理解,来更好的查找到与之相关的精准信息…...
快速排序_912. 排序数组(10中排序算法)
快速排序_912. 排序数组(10中排序算法) 1 快速排序(重点)报错代码超时代码修改官方题解快速排序 1:基本快速排序快速排序 2:双指针(指针对撞)快速排序快速排序 3:三指针快…...
BS5852英国家具防火安全条款主要包括哪几个方面呢?
什么是BS5852检测? BS5852是英国针对家用家具的强制性安全要求,主要测试家具在受到燃烧香烟和火柴等火源时的可燃性。这个标准通常分为四个部分进行测试,但实际应用中主要测试第一部分和第二部分,包括烟头测试和利用乙炔火焰模拟…...
高考或者单招考试需要考物理这科目
问题:帮忙搜索一下以上学校哪些高考或者单招考试需要考物理这科目的 回答: 根据目前获取的资料,明确提及高考或单招考试需考物理的学校为湖南工业职业技术学院,在部分专业单招时要求选考物理;其他学校暂未发现明确提…...
基于vue3实现的课堂点名程序
设计思路 采用vue3实现的课堂点名程序,模拟课堂座位布局,点击开始点名按钮后,一朵鲜花在座位间传递,直到点击结束点名按钮,鲜花停留的座位被点名。 课堂点名 座位组件 seat.vue <script setup>//组合式APIimpo…...
压力传感器
压力传感器是一种用于测量气体或液体压力的设备,广泛应用于工业控制、汽车电子、医疗设备、航空航天等领域。以下是关于压力传感器的详细介绍: 一、压力传感器的分类 1. 按测量原理分类 - 压阻式压力传感器: - 原理:利用压…...
Django REST Framework (DRF) 中用于构建 API 视图类解析
Django REST Framework (DRF) 提供了丰富的视图类,用于构建 API 视图。这些视图类可以分为以下几类: 1. 基础视图类 这些是 DRF 中最基础的视图类,通常用于实现自定义逻辑。 常用类 APIView: 最基本的视图类,所有其…...
DeepSeek介绍[Cache-Through、Cache-Around、Cache-Behind、Cache-Asid]
Cache-Through、Cache-Around、Cache-Behind和Cache-Aside是几种常见的缓存策略,每种策略有其独特的工作机制和应用场景。以下是对这些缓存模式的详细介绍: 1. Cache-Through 工作原理: 读操作:应用程序首先向缓存层请求数据。…...
React 前端框架介绍
什么是 React? React 是一个由 Facebook 开发并维护的开源 JavaScript 库,用于构建用户界面。它主要用于创建交互式用户界Face(UI),尤其是当数据变化时需要更新部分视图时非常有效。React 的核心思想是组件化和声明性…...
自制简单的图片查看器(python)
图片格式:支持常见的图片格式(JPG、PNG、BMP、GIF)。 import os import tkinter as tk from tkinter import filedialog, messagebox from PIL import Image, ImageTkclass ImageViewer:def __init__(self, root):self.root rootself.root.…...
基于Electron+Vue3创建桌面应用
Electron 是一个开源框架,基于 Chromium 和 Node.js,用于开发跨平台桌面应用程序。它允许开发者使用 HTML、CSS 和 JavaScript 等 Web 技术构建原生桌面应用,支持 Windows、macOS 和 Linux。Electron 以其开发便捷性、强大的功能和丰富的生态系统而广泛应用于工具类应用、媒…...
Redis实战-扩展Redis
扩展Redis 1、扩展读性能2、扩展写性能和内存容量3、扩展复杂的查询3.1 扩展联合查询3.2 扩展分片排序 如有侵权,请联系~ 如有错误,也欢迎批评指正~ 本篇文章大部分是来自学习《Redis实战》的笔记 1、扩展读性能 单台Redis服务器…...
Vue 前端开发中的路由知识:从入门到精通
文章目录 引言1. Vue Router 简介1.1 安装 Vue Router1.2 配置 Vue Router1.3 在 Vue 实例中使用 Vue Router 2. 路由的基本用法2.1 路由映射2.2 路由视图2.3 路由链接 3. 动态路由3.1 动态路径参数3.2 访问动态参数3.3 响应路由参数的变化 4. 嵌套路由4.1 定义嵌套路由4.2 渲染…...
为AI聊天工具添加一个知识系统 之109 详细设计之50 三性三量三境
本文要点 纵观整个讨论过程 最初我提“相得益彰的三性(三性) 相提并论的三者(三量) 相映成趣的三化(三境)” “ 确定 今天的讨论题-- “我”的知识树:相得益彰的三性(即 三性&…...
51-ArrayList
51-ArrayList Collection 类型介绍 仓颉中常用的几种基础 Collection 类型,包含 Array、ArrayList、HashSet、HashMap。 可以在不同的场景中选择适合对应业务的类型: Array:如果不需要增加和删除元素,但需要修改元素ÿ…...
工业制造能耗管理新突破,漫途MTIC-ECM平台助力企业绿色转型!
在工业制造领域,能源消耗一直是企业运营成本的重要组成部分。随着“双碳”目标的推进,如何实现高效能耗管理,成为制造企业亟待解决的问题。漫途MTIC-ECM能源能耗在线监测平台,结合其自研的硬件产品,为工业制造企业提供…...
sql注入之python脚本进行时间盲注和布尔盲注
一、什么是时间盲注和布尔盲注? 答:时间盲注是攻击者通过构造恶意sql语句利用sleep()等延迟函数来观察数据库响应时间差异来进行推断信息和条件判断。如果条件为真,数据库会执行延时操作,如果为假则立即返回。响应时间较短。 SELE…...
map的使用(c++)
在了解map之前,我们先看看两个场景,通过这两个场景的对比,让我们知道为什么要存在存储双关键字的容器 场景一:判断一堆字符串中,某一个字符串是否出现过 在没学set容器之前,我们只能想到把这一堆字符串存到…...
Android13-包安装器PackageInstaller-之apk安装流程
目的 我们最终是为了搞明白安装的整个流程通过安卓系统自带的包安装器来了解PMS 安装流程实现需求定制:静默安装-安装界面定制-安装拦截验证。【核心目的】 安装流程和PMS了解不用多说了; 安装定制相关: 如 手机上安装时候弹出锁屏界面需要输入密码;安…...
前端函数在开发环境与生产环境中处理空字符串的差异及解决方案
在前端开发过程中,我们经常会遇到一些函数在开发环境中运行正常,但在生产环境中却出现报错的情况。本文将通过具体的代码示例和分析,探讨一个函数在开发环境和生产环境中处理空字符串的差异,并提供解决方案。 1. 问题描述 我们有…...
数智读书笔记系列014 MICK《SQL进阶教程》第一版和第二版对比和总结
引言 在当今数字化时代,数据已成为企业和组织的核心资产之一。而 SQL(Structured Query Language)作为管理和操作关系型数据库的标准语言,其重要性不言而喻。无论是数据查询、插入、更新还是删除,SQL 都能高效地完成任务,广泛应用于数据分析、数据挖掘、数据仓库、Web 开…...
智能猫眼实现流程图
物理端开发流程图 客户端端开发流程图 用户功能开发流程图 管理员开发流程图...
docker安装kafka,并通过springboot快速集成kafka
目录 一、docker安装和配置Kafka 1.拉取 Zookeeper 的 Docker 镜像 2.运行 Zookeeper 容器 3.拉取 Kafka 的 Docker 镜像 4.运行 Kafka 容器 5.下载 Kafdrop 6.运行 Kafdrop 7.如果docker pull wurstmeister/zookeeper或docker pull wurstmeister/kafka下载很慢&#x…...
Spring Boot 中自动装配机制的原理
Spring Boot 的自动装配机制是其核心特性之一,它简化了 Spring 应用的配置,让开发者能够快速构建应用。以下是对其原理的详细总结: 1. 核心概念 自动装配 (Auto-configuration): Spring Boot 根据应用依赖和配置,自动配置 Spring…...
python继承中super() 不是简单的“调用父类”,而是调用 MRO 里的下一个类
Python 里的一个类可以同时继承多个父类。这让我们的模型设计变得更灵 活,但同时也带来一个新问题:“在复杂的继承关系下,如何确认子类的 某个方法会用到哪个父类?” 这里有点需要理解: MRO(方法解析顺序…...
【智慧校园】分体空调节能监管:打造高效节能的学习环境
随着科技的飞速发展和生活品质的不断提升,人们对于家居和办公环境的舒适度与智能化要求也越来越高。分体空调集中控制系统作为一种先进的空调管理方式,正逐渐成为现代家庭和办公场所的标配,为用户带来更加便捷、高效和节能的空调使用体验。随…...
【达梦数据库】dblink连接[SqlServer/Mysql]报错处理
目录 背景问题1:无法测试以ODBC数据源方式访问的外部链接!问题分析&原因解决方法 问题2:DBLINK连接丢失问题分析&原因解决方法 问题3:DBIINK远程服务器获取对象[xxx]失败,错误洋情[[FreeTDS][SQL Server]Could not find stored proce…...
STM32 ADC介绍(硬件原理篇)
目录 背景 AD转换器 采样与保持 量化 编码 AD转换器转换原理 DA转换原理 AD转换原理 1.逐次逼近型AD转换器 2.并联比较型AD转换器 编码器 同步D触发器和边沿D触发器 基本RS触发器 同步RS触发器 同步D触发器 边沿型D触发器(维持-阻塞D触发器ÿ…...
蚁剑(AutSword)的下载安装与报错解决
蚁剑(AutSword)的下载安装与报错解决 1.下载 唯一官方github下载地址 GitHub - AntSwordProject/AntSword-Loader: AntSword 加载器 2.安装 打开并且进入到下面的界面 下载需要的的版本 进行初始化 3.报错 出现下面的报错 4.解决方法 出现上面报错…...
BT401双模音频蓝牙模块如何开启ble的透传,有什么注意事项
BT401音频蓝牙模块如何开启ble的透传? 首先BT401的蓝牙音频模块,分为两个版本,dac版本和iis数字音频版本 DAC版本:就是BT401蓝牙模块【9和10脚】直接输出模拟音频信号,也就是说,直接推动耳机可以听到声音 …...
209. 长度最小的子数组
这个题目之前做过是用c语言写的 但是我这里用python来写 写的不是很好 感觉自己这里写的还是有问题 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] ,…...
使用IDEA创建Maven项目、Maven坐标,以及导入Maven项目
一、创建Maven项目 正如使用Vue创建工程化的前端项目,此时,使用Maven创建标准化的后端项目。 以下适用于2021版本的IDEA。 name和artifactid会自动保持一致。 Groupid:一般写公司域名倒写,再加上项目名(也可以不…...
从零到一实现微信小程序计划时钟:完整教程
在本教程中,我们将一起实现一个微信小程序——计划时钟。这个小程序的核心功能是帮助用户添加任务、设置任务的时间范围,并且能够删除和查看已添加的任务。通过以下步骤,我们将带你从零开始实现一个具有基本功能的微信小程序计划时钟。 项目…...
最长回文子串(蓝桥云课)
题目链接:8.最长回文子串 - 蓝桥云课 (lanqiao.cn) 代码如下 # include <iostream> # include <cstring> using namespace std; int main() {string str;getline(cin, str);int res 0;for(int i 0; i < str.length(); i){int l i - 1, r i 1;…...
12-滑动窗口
一,定义 滑动窗口算法是一种用于处理数组或字符串问题的技巧,特别适合解决涉及子数组或子串的问题。它的核心思想是通过维护一个“窗口”来高效地计算或查找满足条件的子数组或子串。 基本概念 窗口:窗口是数组或字符串中的一个连续子区间&a…...
时间序列分析(五)——移动平均模型(MA模型)
此前篇章: 时间序列分析(一)——基础概念篇 时间序列分析(二)——平稳性检验 时间序列分析(三)——白噪声检验 时间序列分析(四)——差分运算、延迟算子、AR(p)模型 …...
eNSP防火墙综合实验
一、实验拓扑 二、ip和安全区域配置 1、防火墙ip和安全区域配置 新建两个安全区域 ip配置 Client1 Client2 电信DNS 百度web-1 联通DNS 百度web-2 R2 R1 三、DNS透明代理相关配置 1、导入运营商地址库 2、新建链路接口 3、配置真实DNS服务器 4、创建虚拟DNS服务器 5、配置D…...
ES8字符串填充用法总结:padStart(),padEnd(),rest剩余参数的用法{name,...obj},扩展运算符的用法,正则表达式命名捕获组
ES8(ECMAScript 2017)引入了两个非常有用的字符串填充方法:padStart() 和 padEnd(),它们可以用来在字符串的两端添加指定的填充字符,从而达到指定的字符串长度。这些方法非常适合用于格式化文本和对齐输出。 1. padSt…...
Redis 统计每个数据类型中占用内存最多的前 N 个 bigkey
Redis 统计每个数据类型中占用内存最多的前 N 个 bigkey import redisdef find_bigkeys(hostlocalhost, port6379, db0, n10):r redis.Redis(hosthost, portport, db0)bigkeys {}# 用于存储每种数据类型的键及内存占用type_memory_dict {}# 扫描所有键for key in r.scan_it…...
C++中的.*运算符
看运算符重载的时候,看到这一句 .* :: sizeof ?: . 注意以上5个运算符不能重载。 :: sizeof ?: . 这四个好理解,毕竟都学过,但.*是什么? 于是自己整理了一下 .* 是一种 C 中的运算符,称为指针到成…...
大语言模型简史:从Transformer(2017)到DeepSeek-R1(2025)的进化之路
2025年初,中国推出了具有开创性且高性价比的「大型语言模型」(Large Language Model — LLM)DeepSeek-R1,引发了AI的巨大变革。本文回顾了LLM的发展历程,起点是2017年革命性的Transformer架构,该架构通过「…...
14-H指数
给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义:h 代表“高引用次数” ,一名科研人员的 h 指数 是指他(她)至少发…...
Param ‘serviceName‘ is illegal, serviceName is blank
今天测试nacos服务配置拉取时报了这样一个错误,发现是spring.application.name空值造成的,但是我的bootstrap.yml文件明明配置了,难不成是没有加载bootstrap.yml文件?于是我引入了下面的依赖 <dependency><groupId>o…...
深入剖析Spring MVC
一、Spring MVC 概述 1. 什么是 Spring MVC? Spring MVC 是基于 Spring 框架的 Web 框架,它实现了 MVC 设计模式,将应用程序分为三个核心部分: Model:封装应用程序的数据和业务逻辑。 View:负责渲染数据…...
LLM:RAG
原文链接:LLM:RAG 1、RAG 概览 RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合了信息检索(IR)和 LLM 的技术。它的核心思想是在 LLM 生成回答之前,通过检索相关文档…...
Linux 信号量
Linux 信号量 一、信号量基础概念1.1 同步机制的核心需求1.2 信号量的核心原理1.3 信号量类型对比 二、实战代码解析2.1 共享内存与信号量结合示例2.2 信号量类实现要点 三、关键实现细节分析3.1 初始化三步骤3.2 SEM_UNDO机制3.3 原子操作保证 四、进阶应用场景4.1 生产者-消费…...
如何优化Spark作业的性能
优化Spark作业的性能是一个综合性的任务,涉及多个方面的调整和优化。以下是一些关键的优化策略: 一、开发调优 避免创建重复的RDD: 对于同一份数据,只应该创建一个RDD,避免多次创建RDD来增加性能开销。在对不同的数据…...
ERP对制造业务有何价值?
ERP 的定义 在定义 ERP 之前,我们先从其首字母缩写说起,ERP 代表企业资源规划。我们可以将 ERP 定义为一种企业软件,它帮助组织管理日常业务。从根本上讲,ERP 将客户管理、人力资源、商业智能、财务管理、库存以及供应链功能整合…...
python和pycharm 和Anaconda的关系
好的,下面我会详细说明 Python、PyCharm 和 Anaconda 三者的关系,并逐一解释它们的功能和作用。 1. Python(编程语言) 定义:Python 是一种高级编程语言,设计简洁,易于学习,且功能强…...