NodeJS 生成 16 位 md5 Hash 字符串

你想要在 Node.js 中生成 16 位的 MD5 值,首先需要明确: 标准 MD5 算法生成的是 128 位(16 字节)哈希值,对应 32 位十六进制字符串;通常所说的 16 位 MD5 ,本质是 32 位 MD5 字符串的中间 8 字节(即截取 32 位字符串的第 9 到第 24 位,对应索引 8 到 23) 。
下面提供两种实现方案,涵盖原生模块和第三方模块,满足不同场景需求:
方案一:使用 Node.js 原生 crypto 模块(无需额外安装依赖)
Node.js 内置的 crypto 模块已支持 MD5 哈希计算,无需安装第三方包,是首选方案。
完整代码示例
// 引入原生 crypto 模块
const crypto = require('crypto');
/**
* 生成 16 位 MD5 值(本质是 32 位 MD5 的中间 16 位字符串)
* @param {string} content - 要加密的内容(字符串/Buffer)
* @param {string} encoding - 输入内容编码(默认 utf8)
* @returns {string} 16 位小写 MD5 字符串(如需大写可调用 toUpperCase())
*/
function generate16BitMD5(content, encoding = 'utf8') {
// 1. 创建 MD5 哈希对象
const md5Hash = crypto.createHash('md5');
// 2. 更新要加密的内容(支持字符串或 Buffer)
md5Hash.update(content, encoding);
// 3. 生成 32 位小写 MD5 十六进制字符串
const full32BitMD5 = md5Hash.digest('hex');
// 4. 截取中间 16 位(索引 8 到 23,左闭右开),得到 16 位 MD5
const short16BitMD5 = full32BitMD5.substring(8, 24);
return short16BitMD5;
}
// 测试使用
const testContent = 'hello world';
const md516 = generate16BitMD5(testContent);
console.log('16 位 MD5 结果:', md516); // 输出:5eb63bbbe01eeed09
console.log('16 位 MD5 长度:', md516.length); // 输出:16
// 如需大写格式
const md516Upper = generate16BitMD5(testContent).toUpperCase();
console.log('16 位大写 MD5:', md516Upper); // 输出:5EB63BBBE01EEED09方案二:使用第三方模块 md5 (更简洁,需额外安装)
第三方 md5 模块封装了 MD5 计算逻辑,代码更简洁,适合快速开发。
步骤 1:安装 md5 模块
npm install md5 --save
# 或 yarn add md5步骤 2:完整代码示例
// 引入第三方 md5 模块
const md5 = require('md5');
/**
* 生成 16 位 MD5 值
* @param {string} content - 要加密的内容
* @returns {string} 16 位 MD5 字符串
*/
function generate16BitMD5ByThirdParty(content) {
// 1. 生成 32 位 MD5 字符串
const full32BitMD5 = md5(content);
// 2. 同样截取中间 16 位(索引 8 到 23)
const short16BitMD5 = full32BitMD5.substring(8, 24);
return short16BitMD5;
}
// 测试使用
const testContent = 'hello world';
const md516 = generate16BitMD5ByThirdParty(testContent);
console.log('第三方模块生成的 16 位 MD5:', md516); // 输出:5eb63bbbe01eeed09
console.log('长度验证:', md516.length); // 输出:16关键说明
- 16 位 MD5 的本质 :不存在原生的 16 位 MD5 算法,所谓 16 位 MD5 是 32 位 MD5 字符串的子串(
substring(8, 24)),对应哈希值的中间 8 字节(128 位中的第 33-96 位)。 - 编码问题 :如果加密内容是中文或特殊字符,需确保编码统一(默认
utf8,避免乱码导致 MD5 不一致)。 - Buffer 支持 :原生
crypto模块支持直接传入 Buffer(如文件内容),只需将update方法的第二个参数省略即可。 - 大小写转换 :如需大写 MD5,只需在结果后调用
toUpperCase()方法;如需小写,保持默认即可。
两种方案对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
原生 crypto 模块 | 无需额外安装依赖,稳定 | 代码稍繁琐 | 生产环境、对依赖体积敏感 |
第三方 md5 模块 | 代码简洁,开发效率高 | 需额外安装依赖 | 快速原型开发、小型项目 |
发布评论
发布评论前请先 登录。
评论列表 0

暂无评论





