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

C++ 学习补充 1:短链算法

短链算法

短链算法:
将长链接 转化为 一个短key
之所以不是短url 是因为 ,url 短链不区分大小写,可用空间比较小。

短链算法通常用于将一个长网址转换成一个较短的字符串,以便于分享和存储。这种算法通常需要满足以下条件:

  1. 唯一性:每个短链对应一个唯一的长网址。
  2. 可逆性:能够从短链恢复到原始的长网址。
  3. 简短性:生成的短链尽可能短。
  4. 不区分大小写:短链在生成和使用时不区分大小写。

实现短链算法的一种常见方法是使用哈希函数。以下是一些基本步骤:

  1. 哈希生成:对原始网址使用哈希函数生成一个哈希值。例如,可以使用MD5、SHA-1等。
  2. 编码:将哈希值转换为一个较短的字符串。这可以通过截取哈希值的一部分,或者将哈希值转换为一个基数更小的数字系统(如62进制,使用0-9和a-z)来实现。
  3. 冲突解决:如果两个不同的网址生成了相同的短链,需要有一种机制来解决冲突,例如尝试不同的哈希函数或在短链后添加额外的字符。
  4. 存储映射:将原始网址和生成的短链存储在一个数据库或映射表中,以便于反向查找。

请注意,短链算法的设计和实现可能涉及到复杂的数据结构和算法知识,以及对安全性和性能的考虑。如果你需要具体的实现代码或者更详细的解释,请告诉我,我可以提供进一步的帮助。

下面是一个简单的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;
}

代码解释:

  1. 头文件包含:包括了必要的C++标准库和OpenSSL库的头文件。
  2. toBase62 函数:将MD5哈希值转换为62进制的字符串。它首先定义了一个包含62个字符的字符串base62Chars,然后对MD5哈希值的每个字节进行处理,将其转换为62进制的字符。
  3. generateShortLink 函数:接受一个长网址作为输入,使用MD5算法计算其哈希值,然后调用toBase62函数将哈希值转换为短链。
  4. 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;
}

代码解释:

  1. 头文件包含:包括了iostreamstring和OpenSSL的sha.h头文件。

  2. sha256Hash 函数

    • 定义了一个unsigned char数组hash,大小为SHA256_DIGEST_LENGTH,用于存储SHA-256哈希结果。
    • 使用SHA256_CTX结构体来维护SHA-256的上下文。
    • 调用SHA256_Init初始化SHA-256上下文。
    • 使用SHA256_Update更新上下文,传入要哈希的字符串和字符串的长度。
    • 调用SHA256_Final完成哈希计算,并将结果存储在hash数组中。
    • 使用std::stringstream和十六进制格式化输出将哈希值转换为字符串。
  3. 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:短链算法

短链算法 短链算法&#xff1a; 将长链接 转化为 一个短key 之所以不是短url 是因为 &#xff0c;url 短链不区分大小写&#xff0c;可用空间比较小。 短链算法通常用于将一个长网址转换成一个较短的字符串&#xff0c;以便于分享和存储。这种算法通常需要满足以下条件&#…...

硅纪元视角 | 语音克隆突破:微软VALL-E 2,Deepfake新纪元!

在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展&#xff0c;捕捉行业动态&#xff1b;提供深入的新闻解读&#xff0c;助您洞悉技术背后的逻辑&#xff1b;汇聚行业专家的见解&#xff0c;…...

没有51基础,能不能学好STM32?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「STM32的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 我们通常准备攻读一本大部…...

Web开发:VUE3小白开发入门基础笔记

一、基本语法 1.click 后端路由&#xff1a;api/GetDataList 返回值&#xff1a;Value 前端要做的事&#xff1a; ①拿到Value值&#xff0c;传到a标签 ②a标签有一个按钮&#xff0c;每点击一下&#xff0c;Value的值加一。 前端需要用click语法 【代码】 <template>…...

技术周总结 2024.07.15~07.21周日(Spark性能优化)

文章目录 一、07.19 周五1.1&#xff09;问题01&#xff1a; spark性能优化1.2&#xff09;问题02&#xff1a; spark是怎么应用在机器学习领域的1.3&#xff09;问题03&#xff1a;spark自带工具有哪些&#xff1f;1.4&#xff09;问题04&#xff1a; spark日志的知识点有哪些…...

提高性能的常见技术

1.数据库层面&#xff1a; 读写分离&#xff0c;对于大部分业务来说&#xff0c;读取操作要大于写入&#xff0c;同一个库&#xff0c;既读又写的话&#xff0c;负载会比较重&#xff0c;拆分为读库和写入库&#xff0c;可以降低数据库的负载&#xff0c;分时或延迟将写入的数…...

LeetCode206 反转链表

前言 题目&#xff1a; 206. 反转链表 文档&#xff1a; 代码随想录——反转链表 编程语言&#xff1a; C 解题状态&#xff1a; 有了思路以后没敢尝试 思路 需要注意的是创建指针不会申请额外的内存空间。 代码 方法一&#xff1a; 双指针法/迭代 我的理解是创建了三个指针…...

nginx通过nginx_upstream_check_module实现后端健康检查

1、简介说明 nginx是常用的反向代理和负载均衡服务&#xff0c;具有强大并发能力、稳定性、丰富的功能集、低资源的消耗。 nginx自身是没有针对后端节点健康检查的&#xff0c;但是可以通过默认自带的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版>

目录 关于链表的分类 双向链表结构体 初始化 尾插 头插 打印 判断是否为空 尾删 头删 查找 指定位置之后的插入 指定位置的删除 销毁 关于链表的分类 根据链表的三大特性&#xff0c;单向or双向、带头or不带头、循环or不循环&#xff0c;可将链表分为2*2*2&#xf…...

react18+

主要是围绕函数式组件讲&#xff0c;18主要用就是函数式组件&#xff0c;学习前先熟悉下原生js的基本使用&#xff0c;主要是事件 1、UI操作 1.1、书写jsx标签语言 基本写法和原生如同一则&#xff0c;只是放在一个方法里面返回而已&#xff0c;我们称这样的写法为函数式组件…...

rk3568 OpenHarmony4.1 Launcher定制开发—桌面壁纸替换

Launcher 作为系统人机交互的首要入口&#xff0c;提供应用图标的显示、点击启动、卸载应用&#xff0c;并提供桌面布局设置以及最近任务管理等功能。本文将介绍如何使用Deveco Studio进行单独launcher定制开发、然后编译并下载到开发板&#xff0c;以通过Launcher修改桌面背景…...

MySQL:送分or送命 varchar(30) 与 int(10)

摘要&#xff1a; VARCHAR(30) 和 INT(10) 在MySQL中代表两种不同类型的字段&#xff0c;它们之间的主要区别在于它们存储的数据类型、存储方式以及显示宽度的含义。 正文&#xff1a; INT(10) 在MySQL中&#xff0c;当你看到INT(10)这样的数据类型定义时&#xff0c;可能会…...

【odoo17】后端py方法触发右上角提示组件

概要 在前面文章中&#xff0c;有介绍过前端触发的通知服务。 【odoo】右上角的提示&#xff08;通知服务&#xff09; 此文章则介绍后端触发方法。 内容 直接上代码&#xff1a;但是前提一定是按钮触发&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; def bu…...

1775D - Friendly Spiders

题目链接&#xff1a;Friendly Spiders 首先我们可以考虑暴力做法&#xff0c;那就是每两个蜘蛛判断一下gcd&#xff0c;如果不等于1&#xff0c;那就连条边&#xff0c;这样的话时间复杂度是O&#xff08;n^2&#xff09;&#xff0c;显然超时&#xff0c;因此我们可以采用类似…...

【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语言的常量、枚举、作用域

本专栏将从基础开始&#xff0c;循序渐进&#xff0c;由浅入深讲解Go语言&#xff0c;希望大家都能够从中有所收获&#xff0c;也请大家多多支持。 查看相关资料与知识库 专栏地址:Go专栏 如果文章知识点有错误的地方&#xff0c;请指正&#xff01;大家一起学习&#xff0c;…...

第十一章 数据结构

第十一章 数据结构 11.1 数组 数组是元素的顺序集合&#xff0c;通常这些元素具有相同的数据类型 索引表示元素在数组中的顺序号&#xff0c;顺序号从数组开始处计数 数组元素通过索引被独立给出了地址&#xff0c;数组整体上有一个名称&#xff0c;但每个元素利用数组的的…...

LeetCode704 二分查找

前言 题目&#xff1a; 704.二分查找 文档&#xff1a; 代码随想录——二分查找 编程语言&#xff1a; C 解题状态&#xff1a; 解答错误&#xff0c;变量定义位置错误。 思路 有序数组的查找&#xff0c;最直接的思路应该就是二分查找。但是在查找的过程中要考虑到区间的边界…...

[言简意赅] Matlab生成FPGA端rom初始化文件.coe

&#x1f38e;Matlab生成FPGA端rom初始化文件.coe 本文主打言简意赅。 函数源码 function gencoeInitialROM(width, depth, signal, filepath)% gencoeInitialROM - 生成 Xilinx ROM 初始化格式的 COE 文件%% 输入参数:% width - ROM 数据位宽% depth - ROM 数据深度% s…...

FCEUX终极指南:从怀旧游戏到专业调试的完整NES模拟器教程

FCEUX终极指南&#xff1a;从怀旧游戏到专业调试的完整NES模拟器教程 【免费下载链接】fceux FCEUX, a NES Emulator 项目地址: https://gitcode.com/gh_mirrors/fc/fceux FCEUX是一款功能强大的开源NES模拟器&#xff0c;让你在现代电脑上完美重温经典红白机游戏。无论…...

SSE 基础知识

SSE 基础知识 一、概念定义 SSE 全称 Server-Sent Events&#xff0c;是基于HTTP协议的服务器单向数据推送技术。 建立一次长连接后&#xff0c;服务端可主动持续向前端推送数据&#xff0c;无需客户端反复轮询请求。 二、核心特点 单向通信&#xff1a;仅服务器 → 客户端发送…...

开启Python GUI开发新纪元:Tkinter Designer可视化界面自动化生成终极指南

开启Python GUI开发新纪元&#xff1a;Tkinter Designer可视化界面自动化生成终极指南 【免费下载链接】Tkinter-Designer An easy and fast way to create a Python GUI &#x1f40d; 项目地址: https://gitcode.com/gh_mirrors/tk/Tkinter-Designer 在Python GUI开发…...

别再死磕USB HID了!用ESP32的Arduino框架手把手教你实现蓝牙鼠标键盘(附完整代码)

ESP32蓝牙HID实战&#xff1a;零基础打造自定义键盘鼠标 手里那块吃灰的ESP32开发板终于能派上用场了&#xff01;上周我用它做了个无线演示控制器&#xff0c;在会议室里走着就能翻PPT&#xff0c;同事们都问是怎么实现的。其实秘诀就在于ESP32的蓝牙HID功能——不需要任何USB…...

Burp抓包失败的五大隐形墙与HTTPS解密断裂点排查指南

1. 这不是Burp用得不对&#xff0c;是环境链路断在了你没看见的地方“Burp抓不到包”——这句话我过去三年里听开发、测试、刚转安全的新人说了不下两百遍。但真正打开Burp一看&#xff0c;Proxy标签页里空空如也&#xff0c;连个localhost:8080的请求都没有&#xff0c;十有八…...

CMSIS-DAP调试器原理与应用:以Elektor mbed interface为例

1. 项目概述&#xff1a;Elektor mbed interface [150554] 是什么&#xff1f;如果你玩过ARM Cortex-M系列的单片机&#xff0c;尤其是NXP LPC800系列&#xff0c;那你可能对“CMSIS-DAP”这个调试器标准不陌生。它是由ARM官方推出的一个开源调试接口标准&#xff0c;最大的好处…...

京东自动购物终极指南:告别缺货烦恼,智能抢购神器

京东自动购物终极指南&#xff1a;告别缺货烦恼&#xff0c;智能抢购神器 【免费下载链接】Jd-Auto-Shopping 京东商品补货监控及自动下单 项目地址: https://gitcode.com/gh_mirrors/jd/Jd-Auto-Shopping 还在为心仪商品瞬间售罄而苦恼吗&#xff1f;还在熬夜等待补货却…...

关于软件版本升级的故事

起因在群里有网友说软件的版本升级比较简单&#xff0c;俺就回了四个字母“PACS”&#xff0c;并补上了一个表情 然后看见开始细说了&#xff1a;一、PACS 属于哪一类&#xff1f;PACS 软件 第二类医疗器械&#xff08;独立软件&#xff09;国家药监局分类&#xff1a;Ⅱ 类 2…...

公共卫生机器学习项目中的算法公平性实践:ACAR框架详解

1. 项目概述&#xff1a;当机器学习遇见公共卫生&#xff0c;公平性为何成为“必答题”&#xff1f;在公共卫生领域&#xff0c;机器学习&#xff08;ML&#xff09;正以前所未有的速度渗透到疾病监测、风险分层和资源分配等核心环节。想象一下&#xff0c;一个模型被用来预测某…...

【Midjourney霓虹效果终极指南】:20年AI视觉工程师亲授5大参数组合+3类光源建模公式,97%新手一周内复刻赛博朋克海报

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;霓虹美学的视觉原理与Midjourney适配性解析 霓虹美学源于20世纪都市夜景中的荧光灯管、电子广告与赛博朋克文化&#xff0c;其核心视觉特征包括高饱和度冷暖对比、边缘辉光&#xff08;glow&#xff09;、深色…...