NodeJS 生成 16 位 md5 Hash 字符串

2026-01-02 74 浏览 0 评论

你想要在 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

关键说明

  1. 16 位 MD5 的本质 :不存在原生的 16 位 MD5 算法,所谓 16 位 MD5 是 32 位 MD5 字符串的子串( substring(8, 24) ),对应哈希值的中间 8 字节(128 位中的第 33-96 位)。
  2. 编码问题 :如果加密内容是中文或特殊字符,需确保编码统一(默认 utf8 ,避免乱码导致 MD5 不一致)。
  3. Buffer 支持 :原生 crypto 模块支持直接传入 Buffer(如文件内容),只需将 update 方法的第二个参数省略即可。
  4. 大小写转换 :如需大写 MD5,只需在结果后调用 toUpperCase() 方法;如需小写,保持默认即可。

两种方案对比

方案优点缺点适用场景
原生 crypto 模块无需额外安装依赖,稳定代码稍繁琐生产环境、对依赖体积敏感
第三方 md5 模块代码简洁,开发效率高需额外安装依赖快速原型开发、小型项目

发布评论

发布评论前请先 登录

评论列表 0

暂无评论