C++ 学习补充 1:短链算法
短链算法
短链算法:
将长链接 转化为 一个短key
之所以不是短url 是因为 ,url 短链不区分大小写,可用空间比较小。
短链算法通常用于将一个长网址转换成一个较短的字符串,以便于分享和存储。这种算法通常需要满足以下条件:
- 唯一性:每个短链对应一个唯一的长网址。
- 可逆性:能够从短链恢复到原始的长网址。
- 简短性:生成的短链尽可能短。
- 不区分大小写:短链在生成和使用时不区分大小写。
实现短链算法的一种常见方法是使用哈希函数。以下是一些基本步骤:
- 哈希生成:对原始网址使用哈希函数生成一个哈希值。例如,可以使用MD5、SHA-1等。
- 编码:将哈希值转换为一个较短的字符串。这可以通过截取哈希值的一部分,或者将哈希值转换为一个基数更小的数字系统(如62进制,使用0-9和a-z)来实现。
- 冲突解决:如果两个不同的网址生成了相同的短链,需要有一种机制来解决冲突,例如尝试不同的哈希函数或在短链后添加额外的字符。
- 存储映射:将原始网址和生成的短链存储在一个数据库或映射表中,以便于反向查找。
请注意,短链算法的设计和实现可能涉及到复杂的数据结构和算法知识,以及对安全性和性能的考虑。如果你需要具体的实现代码或者更详细的解释,请告诉我,我可以提供进一步的帮助。
下面是一个简单的C++实现短链算法的示例代码。这个示例使用了MD5哈希函数来生成短链,并将其转换为一个基于62进制的字符串,以实现短链的生成。请注意,这个示例仅用于教学目的,实际应用中可能需要考虑更多的安全性和性能问题。
#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>
#include <openssl/md5.h>// 将MD5哈希值转换为62进制字符串
std::string toBase62(unsigned char hash[MD5_DIGEST_LENGTH]) {const std::string base62Chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";std::string base62Str;for (int i = 0; i < 6; ++i) { // 取MD5的前6个字节unsigned char byte = hash[i];base62Str += base62Chars[byte % 62];byte /= 62;while (byte != 0) {base62Str += base62Chars[byte % 62];byte /= 62;}}return base62Str;
}// 生成短链
std::string generateShortLink(const std::string& longUrl) {unsigned char hash[MD5_DIGEST_LENGTH];// 计算MD5哈希值MD5((unsigned char*)longUrl.c_str(), longUrl.size(), hash);// 将哈希值转换为62进制字符串return toBase62(hash);
}int main() {std::string longUrl = "https://www.example.com/some/very/long/url/that/needs/to/be/shortened";std::string shortLink = generateShortLink(longUrl);std::cout << "Original URL: " << longUrl << std::endl;std::cout << "Short Link: " << shortLink << std::endl;return 0;
}
代码解释:
- 头文件包含:包括了必要的C++标准库和OpenSSL库的头文件。
- toBase62 函数:将MD5哈希值转换为62进制的字符串。它首先定义了一个包含62个字符的字符串
base62Chars,然后对MD5哈希值的每个字节进行处理,将其转换为62进制的字符。 - generateShortLink 函数:接受一个长网址作为输入,使用MD5算法计算其哈希值,然后调用
toBase62函数将哈希值转换为短链。 - main 函数:演示了如何使用
generateShortLink函数生成短链,并打印原始网址和生成的短链。
注意事项:
- 这个示例代码使用了OpenSSL库来计算MD5哈希值,你需要在你的系统上安装OpenSSL库并正确配置编译器以链接这个库。
- MD5虽然广泛用于示例和教学,但在实际应用中可能不够安全,因为它容易受到碰撞攻击。在实际应用中,你可能会考虑使用更安全的哈希算法,如SHA-256。
- 这个示例没有实现冲突解决机制。在实际应用中,如果两个不同的长网址生成了相同的短链,你需要有一种策略来解决这种冲突,例如使用不同的哈希函数或添加随机数。
- 这个示例没有实现短链到长网址的映射存储和反向查找功能,这在实际应用中是必需的。
在C++中实现SHA-256算法,我们可以使用OpenSSL库,它提供了SHA-256的实现。以下是一个使用OpenSSL库实现SHA-256哈希的示例代码:
#include <iostream>
#include <string>
#include <openssl/sha.h>// 将输入字符串进行SHA-256哈希处理
std::string sha256Hash(const std::string& input) {unsigned char hash[SHA256_DIGEST_LENGTH];SHA256_CTX sha256;SHA256_Init(&sha256);SHA256_Update(&sha256, input.c_str(), input.size());SHA256_Final(hash, &sha256);// 将哈希值转换为十六进制字符串std::stringstream ss;for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) {ss << std::hex << std::setw(2) << std::setfill('0') << (int)hash[i];}return ss.str();
}int main() {std::string input = "Hello, World!";std::string hash = sha256Hash(input);std::cout << "Original String: " << input << std::endl;std::cout << "SHA-256 Hash: " << hash << std::endl;return 0;
}
代码解释:
-
头文件包含:包括了
iostream、string和OpenSSL的sha.h头文件。 -
sha256Hash 函数:
- 定义了一个
unsigned char数组hash,大小为SHA256_DIGEST_LENGTH,用于存储SHA-256哈希结果。 - 使用
SHA256_CTX结构体来维护SHA-256的上下文。 - 调用
SHA256_Init初始化SHA-256上下文。 - 使用
SHA256_Update更新上下文,传入要哈希的字符串和字符串的长度。 - 调用
SHA256_Final完成哈希计算,并将结果存储在hash数组中。 - 使用
std::stringstream和十六进制格式化输出将哈希值转换为字符串。
- 定义了一个
-
main 函数:
- 定义了一个示例字符串
input。 - 调用
sha256Hash函数计算字符串的SHA-256哈希值。 - 打印原始字符串和其对应的SHA-256哈希值。
- 定义了一个示例字符串
注意事项:
- 确保你的系统安装了OpenSSL库,并且你的编译器配置正确以链接OpenSSL库。
- SHA-256哈希是单向的,意味着你不能从哈希值恢复原始输入。
- 这个示例代码仅用于演示如何使用OpenSSL库计算SHA-256哈希值。在实际应用中,你可能需要考虑错误处理、安全性和性能优化等问题。
要编译和运行这段代码,你需要确保链接了OpenSSL库。例如,如果你使用的是g++编译器,可以使用以下命令:
g++ -o sha256_example sha256_example.cpp -lcrypto
这将编译代码并链接OpenSSL的加密库(-lcrypto)。
相关文章:
C++ 学习补充 1:短链算法
短链算法 短链算法: 将长链接 转化为 一个短key 之所以不是短url 是因为 ,url 短链不区分大小写,可用空间比较小。 短链算法通常用于将一个长网址转换成一个较短的字符串,以便于分享和存储。这种算法通常需要满足以下条件&#…...
硅纪元视角 | 语音克隆突破:微软VALL-E 2,Deepfake新纪元!
在数字化浪潮的推动下,人工智能(AI)正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展,捕捉行业动态;提供深入的新闻解读,助您洞悉技术背后的逻辑;汇聚行业专家的见解,…...
没有51基础,能不能学好STM32?
在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「STM32的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!! 我们通常准备攻读一本大部…...
Web开发:VUE3小白开发入门基础笔记
一、基本语法 1.click 后端路由:api/GetDataList 返回值:Value 前端要做的事: ①拿到Value值,传到a标签 ②a标签有一个按钮,每点击一下,Value的值加一。 前端需要用click语法 【代码】 <template>…...
技术周总结 2024.07.15~07.21周日(Spark性能优化)
文章目录 一、07.19 周五1.1)问题01: spark性能优化1.2)问题02: spark是怎么应用在机器学习领域的1.3)问题03:spark自带工具有哪些?1.4)问题04: spark日志的知识点有哪些…...
提高性能的常见技术
1.数据库层面: 读写分离,对于大部分业务来说,读取操作要大于写入,同一个库,既读又写的话,负载会比较重,拆分为读库和写入库,可以降低数据库的负载,分时或延迟将写入的数…...
LeetCode206 反转链表
前言 题目: 206. 反转链表 文档: 代码随想录——反转链表 编程语言: C 解题状态: 有了思路以后没敢尝试 思路 需要注意的是创建指针不会申请额外的内存空间。 代码 方法一: 双指针法/迭代 我的理解是创建了三个指针…...
nginx通过nginx_upstream_check_module实现后端健康检查
1、简介说明 nginx是常用的反向代理和负载均衡服务,具有强大并发能力、稳定性、丰富的功能集、低资源的消耗。 nginx自身是没有针对后端节点健康检查的,但是可以通过默认自带的ngx_http_proxy_module 模块和ngx_http_upstream_module模块中的相关指令来完…...
FastGPT 知识库搜索测试功能解析(二)
目录 一、代码解析 1.1 searchTest.ts 1.2 controller.ts 本文接上一篇文章FastGPT 知识库搜索测试功能解析 对具体代码进行解析。 一、代码解析 FastGPT 知识库的搜索测试功能主要涉及两个文件,分别是 searchTest.ts 和 controller.ts 文件,下面分别进行介绍。 1.1 se…...
双向链表<数据结构 C版>
目录 关于链表的分类 双向链表结构体 初始化 尾插 头插 打印 判断是否为空 尾删 头删 查找 指定位置之后的插入 指定位置的删除 销毁 关于链表的分类 根据链表的三大特性,单向or双向、带头or不带头、循环or不循环,可将链表分为2*2*2…...
react18+
主要是围绕函数式组件讲,18主要用就是函数式组件,学习前先熟悉下原生js的基本使用,主要是事件 1、UI操作 1.1、书写jsx标签语言 基本写法和原生如同一则,只是放在一个方法里面返回而已,我们称这样的写法为函数式组件…...
rk3568 OpenHarmony4.1 Launcher定制开发—桌面壁纸替换
Launcher 作为系统人机交互的首要入口,提供应用图标的显示、点击启动、卸载应用,并提供桌面布局设置以及最近任务管理等功能。本文将介绍如何使用Deveco Studio进行单独launcher定制开发、然后编译并下载到开发板,以通过Launcher修改桌面背景…...
MySQL:送分or送命 varchar(30) 与 int(10)
摘要: VARCHAR(30) 和 INT(10) 在MySQL中代表两种不同类型的字段,它们之间的主要区别在于它们存储的数据类型、存储方式以及显示宽度的含义。 正文: INT(10) 在MySQL中,当你看到INT(10)这样的数据类型定义时,可能会…...
【odoo17】后端py方法触发右上角提示组件
概要 在前面文章中,有介绍过前端触发的通知服务。 【odoo】右上角的提示(通知服务) 此文章则介绍后端触发方法。 内容 直接上代码:但是前提一定是按钮触发!!!!! def bu…...
1775D - Friendly Spiders
题目链接:Friendly Spiders 首先我们可以考虑暴力做法,那就是每两个蜘蛛判断一下gcd,如果不等于1,那就连条边,这样的话时间复杂度是O(n^2),显然超时,因此我们可以采用类似…...
【python】OpenCV—Point Polygon Test
文章目录 1、完整代码2、涉及到的库cv2.pointPolygonTestcv2.minMaxLoc 1、完整代码 from __future__ import print_function from __future__ import division import cv2 as cv import numpy as np # Create an image r 100 src np.zeros((4*r, 4*r), dtypenp.uint8) # 创…...
6 Go语言的常量、枚举、作用域
本专栏将从基础开始,循序渐进,由浅入深讲解Go语言,希望大家都能够从中有所收获,也请大家多多支持。 查看相关资料与知识库 专栏地址:Go专栏 如果文章知识点有错误的地方,请指正!大家一起学习,…...
第十一章 数据结构
第十一章 数据结构 11.1 数组 数组是元素的顺序集合,通常这些元素具有相同的数据类型 索引表示元素在数组中的顺序号,顺序号从数组开始处计数 数组元素通过索引被独立给出了地址,数组整体上有一个名称,但每个元素利用数组的的…...
LeetCode704 二分查找
前言 题目: 704.二分查找 文档: 代码随想录——二分查找 编程语言: C 解题状态: 解答错误,变量定义位置错误。 思路 有序数组的查找,最直接的思路应该就是二分查找。但是在查找的过程中要考虑到区间的边界…...
[言简意赅] Matlab生成FPGA端rom初始化文件.coe
🎎Matlab生成FPGA端rom初始化文件.coe 本文主打言简意赅。 函数源码 function gencoeInitialROM(width, depth, signal, filepath)% gencoeInitialROM - 生成 Xilinx ROM 初始化格式的 COE 文件%% 输入参数:% width - ROM 数据位宽% depth - ROM 数据深度% s…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
