为什么不应该用 Date.now() 生成 ID,以及更好的做法

更新日期: 2025-11-01 阅读: 85 标签: uuid

在编程时,我们经常需要生成唯一的标识符。很多人习惯用 Date.now() 来生成 ID,觉得这样简单方便。但实际上,这种做法存在不少问题。


什么是唯一 ID?

唯一 ID 就像我们的身份证号码,每个都应该是独一无二的。好的唯一 ID 应该是这样的:

"a1b2c3d4-e5f6-7890-abcd-ef1234567890"
"xV5kP9qR2sT8wY3z"

而不好的 ID 是这样的:

1698324567890  // 用 Date.now() 生成


为什么不要用 Date.now()?

  1. 容易重复

看看这个例子:

function generateID() {
    return Date.now();
}

// 在同一毫秒内调用多次
console.log(generateID()); // 1698324567890
console.log(generateID()); // 1698324567890 - 两个完全一样!

在现代计算机上,一个毫秒内可能执行很多操作。如果多个操作在同一毫秒发生,生成的 ID 就会重复。

  1. 安全性问题

时间戳 ID 很容易被猜出来:

  • 别人可以根据时间推测其他 ID

  • 可能泄露系统运行时间

  • 容易被恶意利用

  1. 不适合分布式系统

在多台服务器的情况下,不同服务器的时间可能有微小差异,更容易产生重复 ID。


更好的解决方案

  1. 使用 crypto.randomUUID()(推荐)

const uniqueId = crypto.randomUUID();
console.log(uniqueId); 
// 输出类似:"d9bbf5d0-5c5b-4b7c-9c3d-1a1b1c1d1e1f"

这种方法的好处:

  • 基于加密安全的随机数

  • 重复概率极低

  • 符合行业标准

  • 现代浏览器和 Node.js 都支持

  1. 如果需要短一些的 ID

function generateShortID() {
    return crypto.randomUUID().replace(/-/g, '').substring(0, 12);
}

console.log(generateShortID()); // "d9bbf5d05c5b"


实际使用场景

  1. 数据库主键

const user = {
    id: crypto.randomUUID(),
    name: "张三",
    email: "zhang@example.com"
};

// 保存到数据库
db.users.insert(user);
  1. 文件上传命名

function handleFileUpload(file) {
    const uniqueFileName = `${crypto.randomUUID()}_${file.name}`;
    
    // 保存文件,确保不会重名
    saveFile(uniqueFileName, file);
}
  1. 会话管理

function createUserSession(user) {
    const sessionId = crypto.randomUUID();
    
    sessions.set(sessionId, {
        userId: user.id,
        createdAt: new Date(),
        expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000) // 24小时后过期
    });
    
    return sessionId;
}
  1. 前端列表渲染

function TodoList({ todos }) {
    return (
        <ul>
            {todos.map(todo => (
                <li key={crypto.randomUUID()}>
                    {todo.text}
                </li>
            ))}
        </ul>
    );
}


其他替代方案

如果因为某些原因不能使用 crypto.randomUUID(),可以考虑这些方法:

  1. 使用时间戳加随机数

function generateID() {
    return Date.now() + '_' + Math.random().toString(36).substring(2);
}
// 输出:"1698324567890_abc123def456"
  1. 使用第三方库

比如使用 uuid 库:

import { v4 as uuidv4 } from 'uuid';
const id = uuidv4();


注意事项

  1. 浏览器兼容性

crypto.randomUUID() 在现代浏览器中都支持,但如果要支持老版本浏览器,需要检查兼容性。

  1. Node.js 版本

在 Node.js 中,crypto.randomUUID() 从 16.0 版本开始支持。如果使用更早的版本,可以用:

const { randomUUID } = require('crypto');
const id = randomUUID();
  1. ID 长度考虑

标准的 UUID 有 36 个字符,如果存储空间有限,可以考虑生成短一些的 ID。


总结

生成唯一 ID 时,记住这些要点:

  • 不要单独使用 Date.now(),容易重复

  • 优先使用 crypto.randomUUID()

  • 如果需要短 ID,可以截取 UUID 的一部分

  • 考虑使用场景和兼容性

养成使用正确方法生成唯一 ID 的习惯,能让你的应用更加稳定可靠。好的 ID 生成方案就像给数据上了保险,避免很多潜在的问题。

从现在开始,改掉使用 Date.now() 生成 ID 的习惯吧。用 crypto.randomUUID(),一行代码就能解决这个问题,让你的代码更加专业和可靠。

本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!

链接: https://fly63.com/article/detial/13107

什么是UUId?理解UUId的五个版本和使用

UUID 的全称是 Universally Unique Identifier,中文为通用唯一识别码。构成:由一组32位数的16进制数字所构成。格式:以连字号分为五段,表现形式为8-4-4-4-12的32个字符

JS生成唯一id方式介绍(UUID和NanoID)

之前代码中前端生成唯一的id方式,一般采用uuid的方式,最近唯一id有了更好的方式,那就是NanoID,今天这篇文章记录一下NanoID 正在取代 UUID?及js 生成uuid及NanoID的方法

uniapp获取设备的唯一标识uuid

UUID:Universally Unique Identifier,通用唯一识别码。目前最广泛应用的UUID,是微软公司的全局唯一标识符GUID。其目的是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。

ULID 与 UUID:用于 JavaScript 的可排序随机 ID 生成器

UUID是软件开发中最常用的通用标识符之一。然而,在过去的几年里,新的替代品挑战了它的存在。其中,ULID 是领先的竞争对手之一,因为它提供可排序的唯一 ID。

UUID正在被NanoID取代?

UUID 是软件开发中最常用的通用标识符之一。然而,在过去的几年里,其他的竞品挑战了它的存在。其中,NanoID 是 UUID 的主要竞争对手之一。

Js生成UUID的几种方法

UUID(Universally Unique IDentifier) 全局唯一标识符。UUID是一种由算法生成的二进制长度为128位的数字标识符。在理想情况下,任何计算机和计算机集群都不会生成两个相同的UUID。

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!