纯 JavaScript 生成UUID和随机MD5值

在开发中,我们经常需要生成唯一的标识符或随机的哈希值。在这篇博客中,我将介绍如何使用纯 JavaScript 生成 UUID(通用唯一标识符)和随机 MD5 值的方法。这些方法适用于前端和后端开发,让我们一起深入浅出地了解吧。

UUID & MD5

前言

UUID:(通用唯一标识符),它是一个标准化的字符串标识符,长度为 36 个字符,包括 32 个十六进制数字和 4 个连字符(例如:550e8400-e29b-41d4-a716-446655440000)。请注意,UUID 并不是通过哈希算法生成的,而是根据特定的算法和规则生成的唯一标识符。

MD5、SHA-1、SHA-256、SHA-384 和 SHA-512 是常见的哈希算法,它们生成的哈希值长度如下:

哈希算法长度字节长度字符串长度(十六进制字符)
MD5128 位16 字节32 个
SHA-1160 位20 字节40 个
SHA-256256 位32 字节64 个
SHA-384384 位48 字节96 个
SHA-512512 位64 字节128 个

在实际开发中,我们通常使用 MD5 算法生成哈希值,因为它的长度适中,而且速度快,安全性也足够高。

一、生成UUID

UUID是一种唯一标识符,通常用于标识信息或对象。

  1. 使用纯JavaScript生成UUID的方法:
function genUUID() {
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
    var r = (Math.random() * 16) | 0,
        v = c === 'x' ? r : (r & 0x3) | 0x8;
    return v.toString(16);
  });
}

// 示例用法
const uuid = genUUID();
console.log(uuid);

这个函数使用了UUID的标准格式,并通过替换操作生成了一个随机的UUID。你可以在项目中直接使用这个函数,确保生成的UUID是唯一的。

  1. 使用最新浏览器内置的crypto API生成UUID,这个方法更简单更高效,方法如下:
const genUUID = () => {
  return crypto.randomUUID()
}
  1. 如果长度没有限制,我们可以使用Math.random()方法生成一个随机的字符串,方法如下:
const genUUID = () => {
  return Math.random().toString(36).substring(2)
}

二、生成随机MD5值

MD5 是一种常用的哈希算法,我们可以使用它来生成唯一的散列值。

我们可以使用浏览器内置的crypto API生成随机MD5值,方法如下:

const md5 = async (str) => {
  const msgUint8 = new TextEncoder().encode(str) // 编码为(utf-8)Uint8Array
  const hashBuffer = await crypto.subtle.digest('SHA-1', msgUint8) // 计算消息的哈希值
  const hashArray = Array.from(new Uint8Array(hashBuffer)) // 将缓冲区转换为字节数组
  const hashHex = hashArray.map((b) => b.toString(16).padStart(2, '0')).join('') // 将字节数组转换为十六进制字符串
  return hashHex
}

const generateRandomMD5 = async () => {
  return await md5(Math.random().toString(36))
}

// 示例用法
const randomMD5 = generateRandomMD5();
console.log(randomMD5); // f185173fa08df8360d12cbcd795c7cf59240996b
console.log(randomMD5.length); // 40

这样生成的随机字符串长度为 40,如果想要和真正的MD5值一样长度为 32,可以使用 slice 方法截取前 32位,方法如下:

const md5 = async (str) => {
  const msgUint8 = new TextEncoder().encode(str) // 编码为(utf-8)Uint8Array
  const hashBuffer = await crypto.subtle.digest('SHA-1', msgUint8) // 计算消息的哈希值
  const hashArray = Array.from(new Uint8Array(hashBuffer)) // 将缓冲区转换为字节数组
  const hashHex = hashArray.map((b) => b.toString(16).padStart(2, '0')).join('') // 将字节数组转换为十六进制字符串
  return hashHex.slice(0, 32) // 截取前32位
}

这两个方法可以方便地在你的项目中生成UUID和随机MD5值。记得根据项目需求选择合适的方法,确保生成的值足够唯一和安全。

参考文档:https://developer.mozilla.org/zh-CN/docs/Web/API/Crypto


欢迎访问:天问博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

this.setState的注意事项

目录 1、this.setState的注意事项 2、是什么造成了this.setState()的不同步? 3、 那this.setState()什么时候同步,什么时候不同步? 3.1 经过React包装的onClick点击事件() 3.2 没经过React包装的 原生点击事件 …

浅析Linux进程管理:current宏实现

本文基于Linux 5.10.186版本内核源码进行分析。 文章目录 current概述早期内核版本实现最新版本内核实现x86体系下的current宏实现ARMv8体系下的current实现 相关参考 current概述 Linux内核在运行时经常需要访问当前运行进程的task_struct指针,于是,系…

ptaR7-6/zzuli2106 有去有回

题目 输入n个整数,第一趟按从左到右间隔k个数取数据,然后第二趟再从右到左间隔k-1个数取余下的数,如果数据没有取完,下一趟再间隔k-2个从左到右取数据,如此反复,直到所有的数据取完为止。注意:…

【2023年度回顾】让我们在新的一年继续努力前行

每当我们在努力的时候都会想:为什么我要努力?躺着不舒服吗? 大家好!我是命运之光,一名普普通通的计算机科学与技术专业的大三学生。 📕回顾一下整个2023年 因为我有每天发朋友圈的习惯,所以这一…

QToolBar、QStatusBar和QDockWidget的使用

1. 工具栏 QToolBar 1.1 创建工具栏 1.1.1 工具栏的基本函数 设置工具栏的停靠区域 参数 Qt::LeftToolBarArea //左边 Qt::RightToolBarArea //右边 Qt::TopToolBarArea //顶部 Qt::BottomToolBarArea //底部 Qt::AllToolBarAreas //所有区域 Qt::NoToolBarArea //没有QMa…

数据结构与算法之美学习笔记:47 | 向量空间:如何实现一个简单的音乐推荐系统?

这里写自定义目录标题 前言算法解析总结引申 前言 本节课程思维导图: 很多人都喜爱听歌,以前我们用 MP3 听歌,现在直接通过音乐 App 在线就能听歌。而且,各种音乐 App 的功能越来越强大,不仅可以自己选歌听&#xff0…

HBase 复制、备份、迁移

行业分享 HBase金融大数据乾坤大挪移 https://www.jianshu.com/p/cb4a645dd66a HBase跨机房迁移技术分享总结 https://www.jianshu.com/p/defc787b2704 dbaplus181期:腾讯金融HBase跨机房迁移实战 https://m.qlchat.com/topic/details?topicId2000003847589595 ht…

原生Jdbc获取库、表、字段;驼峰与下划线转换

1、获取catalog 1)代码如下: /*** 获取catalog** param jdbcdriver 驱动类(DriverClass)(com.mysql.cj.jdbc.Driver)* param url 地址(jdbc:mysql://10.20.30.40:3306)* param username 用户名* param password 密码*/public static List&l…

[acm算法学习] 后缀数组SA

学习自B站up主 kouylan 定义 后缀是包含最后个字母的子串 把字符串 str 的所有后缀按字典排序,sa[i]表示排名为 i 的后缀的开头下标 如何求解SA 倍增的方法 先把每个位置开始的长度为1的子串排序,在此基础上再把长度为2的子串排序(长度…

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-7 LQR控制器 Linear Quadratic Regulator

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-7 LQR控制器 Linear Quadratic Regulator 线性控制器设计-轨迹跟踪(Fellow a Desired Path)

软件测试|如何实现字典的键值互换,你会了吗?

简介 在Python中,字典是一种非常有用的数据结构,它将数据存储为键值对,并且键必须是唯一的。有时候,我们可能需要将字典的键和值互换,以便查找或操作数据更加方便。本文将详细介绍如何在Python中实现字典键值的互换操…

【Effective Objective - C】—— 熟悉Objective-C

【Effective Objective - C】—— 熟悉Objective-C 熟悉Objective-C1.oc的起源消息和函数的区别运行期组件和内存管理要点: 2.在类的头文件中尽量少引入其他头文件向前声明要点: 3.多使用字面量语法,少用与之等价的方法字符串字面量字面数值字…

AntDesignBlazor示例——暗黑模式

本示例是AntDesign Blazor的入门示例,在学习的同时分享出来,以供新手参考。 示例代码仓库:https://gitee.com/known/BlazorDemo 1. 学习目标 暗黑模式切换查找组件样式覆写组件样式 2. 添加暗黑模式切换组件 1)双击打开MainL…

在CMake中自定义宏 add_definitions(-DDEBUG)

hehedalinux:~/Linux/loveDBTeacher-v6$ tree . ├── CMakeLists.txt └── test.c0 directories, 2 files hehedalinux:~/Linux/loveDBTeacher-v6$ test.c #include <stdio.h> #define NUMBER 3int main() {int a 10; #ifdef DEBUGprintf("我是一个程序猿,我…

驾驭未来:从传统运维到智能化运维的转型之路

随着科技的飞速发展&#xff0c;企业的业务需求也在不断变化。为了满足这些需求&#xff0c;企业的IT架构逐渐向云原生、容器化和微服务化演进。作为支撑企业业务发展的运维人员&#xff0c;我们需要紧跟时代步伐&#xff0c;不断提升自己的技能和认知水平。 在2023年全球运维大…

评估LLM在细胞数据上的实用性(3)-基因层面的评估

目录 定义基因功能预测扰动预测基因网络分析 基因层面的评估基因功能预测扰动预测基因网络分析 定义 基因功能预测 基因功能预测对于识别基因在不同条件下的特性非常重要。因为人类大约有20,000个蛋白质编码基因&#xff0c;只有一些被标注了功能。对基因功能的准确预测可以帮…

CMake在静态库中链接静态库

hehedalinux:~/Linux/multi-v2$ tree . ├── calc │ ├── add.cpp │ ├── CMakeLists.txt │ ├── div.cpp │ ├── mult.cpp │ └── sub.cpp ├── CMakeLists.txt ├── include │ ├── calc.h │ └── sort.h ├── lib │ ├── l…

【WEB API自动化测试】接口文档与在线测试

这一篇我们主要介绍如何做API帮助文档&#xff0c;给API的调用人员介绍各个 API的功能, 输入参数&#xff0c;输出参数, 以及在线测试 API功能(这个也是方便我们自己开发调试) 我们先来看看我们的API最终帮助文档及在线测试最终达到的效果: 概要图 GET API 添加产品API: 删除…

flutter使用get库管理路由,并设页面跳转动画和常见动画

get库还是非常强大的一个仓库&#xff0c;里面包含了非常常用的一些方法&#xff0c;比如路由管理&#xff0c;这是最常见和最常用的一个功能了&#xff0c;我们可以先配置一个路由对象&#xff0c;然后在里面配置路由列表&#xff0c;并且设置路由跳转方式。 第一种方式&…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷⑦

2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷7 目录 需要竞赛软件包环境以及备赛资源可私信博主&#xff01;&#xff01;&#xff01; 2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷7 模块一 …