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)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/49779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构(2)双向链表

链表 线性表的链式存储 解决顺序存储的缺点&#xff0c;插入和删除&#xff0c;动态存储问题。 特点&#xff1a; 线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素&#xff0c; 存储单元可以是连续的&#xff0c;也可以不连续。可以被存储…

nginx代理缓存配置-Linux(CentOS)

代理缓存 1. 编写主配置文件2. 编辑虚拟机配置文件3. 重启nginx服务 nginx代理服务配置&#xff0c;基于http协议 开启代理缓存的前提是已经开启了代理服务&#xff0c;请确保已经开启代理服务 1. 编写主配置文件 主配置文件通常在/etc/nginx/nginx.conf&#xff0c;在该文件…

【云原生】ReplicationController控制器详解

ReplicationController 文章目录 ReplicationController说明一、ReplicationControllere介绍二、ReplicationController如何工作三、运行一个ReplicationController四、编写一个ReplicationController清单注意事项4.1、Pod模板4.2、ReplicationController上的标签4.3、Pod选择算…

python机器学习8--自然语言处理(1)

1.基本定义&#xff1a; 语义&#xff1a;就是一句话的重点是什么。 自定词汇&#xff1a;因为语言、文字太多&#xff0c;自定和处理你所关心的重点词汇。 简体转繁体代码 from opencc import OpenCCtext1 "我去过清华大学" openCC OpenCC(s2t) line openCC.…

Typora 【最新1.8.6】版本安装下载教程 (轻量级 Markdown 编辑器),图文步骤详解,免费领取(软件可激活使用)

文章目录 软件介绍软件下载安装步骤激活步骤 软件介绍 Typora 是一款专为 Markdown 爱好者设计的文本编辑器&#xff0c;它结合了简洁的界面设计与强大的 Markdown 渲染能力&#xff0c;为用户提供了一个流畅、高效的写作环境。以下是对 Typora 更详细的介绍&#xff1a; 核心特…

vue使用mavonEditor(流程图、时序图、甘特图实现)

mavonEditor 安装mavonEditor $ npm install mavon-editor --save使用 // 全局注册import Vue from vueimport mavonEditor from mavon-editorimport mavon-editor/dist/css/index.css// useVue.use(mavonEditor)new Vue({el: #main,data() {return { value: }}})//局部使用…

js-vue中多个按钮状态选中类似于复选框与单选框实现

1.vue中多个按钮状态选中类似于复选框 在Vue中处理多个按钮的选中状态切换&#xff0c;通常我们会利用Vue的响应式数据系统来追踪每个按钮的选中状态。 html <div id"app"> <button v-for"button in buttons" :key"button.id" :c…

MATLAB绘制方波、锯齿波、三角波、正弦波和余弦波、

一、引言 MATLAB是一种具有很强的数值计算和数据可视化软件&#xff0c;提供了许多内置函数来简化数学运算和图形的快速生成。在MATLAB中&#xff0c;你可以使用多种方法来快速绘制正弦波、方波和三角波。以下是一些基本的示例&#xff0c;展示了如何使用MATLAB的命令来实现正弦…

数据科学统计面试问题 -40问

前 40 名数据科学统计面试问题 一、介绍 正如 Josh Wills 曾经说过的那样&#xff0c;“数据科学家是一个比任何程序员都更擅长统计、比任何统计学家都更擅长编程的人”。统计学是数据科学中处理数据及其分析的基本工具。它提供了工具和方法&#xff0c;可帮助数据科学家获得…

第五节shell脚本中的运行流程控制(5.2)

b)应答语句中的变量 #!/usr/bin/expect spawn sh ask.sh set timeout 5 set NAME [ lindex $argv 0 ] set AGE [ lindex $argv 1 ] set SUB [ lindex $argv 2 ] set FEEL [ lindex $argv 3 ] expect {"name" { send "$NAME\r";exp_continue }"old&qu…

【React】条件渲染:深入探讨高效开发技巧与最佳实践

文章目录 一、什么是条件渲染&#xff1f;二、条件渲染的实现方式三、条件渲染的最佳实践四、复杂条件渲染的实现 在现代前端开发中&#xff0c;React 已成为开发者构建用户界面的首选框架之一。React 的强大之处在于其组件化和状态管理能力&#xff0c;而条件渲染则是 React 开…

Linux Vim教程(六):文件操作与保存

目录 1. 打开与关闭文件 1.1 打开文件 1.2 关闭文件 1.3 保存文件 2. 创建和删除文件 2.1 创建新文件 2.2 删除文件 3. 文件浏览与导航 3.1 切换文件 3.2 文件列表 4. 文件保存技巧 4.1 强制保存 4.2 保存为新文件 4.3 自动保存 5. 文件操作的高级技巧 5.1 分割…

防火墙限制docker了

今天有个安全方面的需求&#xff0c;演示环境禁止将3306等高危端口暴露到外网。 于是同事开启了防火墙&#xff0c;仅将应用端口暴露。结果导致演示环境无法使用。 由于公司的应用是基于docker部署的。结果他问我为什么同一台机器&#xff0c;应用无法访问mysql。 docker对于…

ELK Stack入门之部署EFK架构

前言&#xff1a; 日志分析对于现代IT系统来说至关重要&#xff0c;它可以帮助组织机构理解和优化其业务和技术基础设施。以下是日志分析的一些重要性方面&#xff1a; 问题诊断与故障排除&#xff1a; 当系统发生故障或出现异常时&#xff0c;通过对相关日志进行分析&#xf…

SQL labs-SQL注入(五,使用sqlmap进行cookie注入)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 引言&#xff1a; Cookie 是一些数据, 存储于你电脑上的文本文件中。当 web 服务器向浏览器发送 web 页面时&#xff0c;在连接关闭后&#xff0c;服务端不会记录用户的信息。Cookie…

第十一章 数据结构

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

elasticsearch 解决全模糊匹配最佳实践

事件背景&#xff1a; 某 CRM 系统&#xff0c;定义了如下两个表&#xff1a; 客户表 t_custom 字段名 类型 描述 idlong自增主键phonestring客户手机......... 客户产品关系表 t_custom_product 字段名 类型 描述 idlong自增主键custom_idlong客户idproduct_idlong产品…

【buildroot系统中qt显示屏触摸方向更改】

buildroot系统和qt的显示触摸不一致&#xff0c;qt程序出现显示触摸上下颠倒问题 操作全部在启动qt程序之前设置系统显示配置 操作全部在启动qt程序之前设置系统显示配置 我的设备是上电自启动我的qt程序&#xff0c;所以为了方便我全部在调用我的qt程序位置处修改vi /etc/ini…

vue如何适应多个页面不同的布局

在 Vue.js 中&#xff0c;要适应多个页面不同的布局&#xff0c;你可以采用以下几种方法&#xff1a; 使用动态组件 (Dynamic Components)&#xff1a; 通过使用 Vue 的动态组件&#xff0c;可以在同一个页面中根据路由动态加载不同的布局组件。 <template><component…

笔记本检测工具 | 爱回收笔记本质检系统 v1.9.6

软件简介 爱回收笔记本质检系统是一款专为笔记本电脑硬件检测而设计的软件。它以其快速的检测速度、简便的操作流程和直观的检测结果&#xff0c;为用户提供了一种高效、易懂的硬件检测解决方案。 这款软件不仅适用于对电脑硬件有一定了解的用户&#xff0c;也特别适合对硬件…