在编程时,我们经常需要生成唯一的标识符。很多人习惯用 Date.now() 来生成 ID,觉得这样简单方便。但实际上,这种做法存在不少问题。
唯一 ID 就像我们的身份证号码,每个都应该是独一无二的。好的唯一 ID 应该是这样的:
"a1b2c3d4-e5f6-7890-abcd-ef1234567890"
"xV5kP9qR2sT8wY3z"而不好的 ID 是这样的:
1698324567890  // 用 Date.now() 生成容易重复
看看这个例子:
function generateID() {
    return Date.now();
}
// 在同一毫秒内调用多次
console.log(generateID()); // 1698324567890
console.log(generateID()); // 1698324567890 - 两个完全一样!在现代计算机上,一个毫秒内可能执行很多操作。如果多个操作在同一毫秒发生,生成的 ID 就会重复。
安全性问题
时间戳 ID 很容易被猜出来:
别人可以根据时间推测其他 ID
可能泄露系统运行时间
容易被恶意利用
不适合分布式系统
在多台服务器的情况下,不同服务器的时间可能有微小差异,更容易产生重复 ID。
使用 crypto.randomUUID()(推荐)
const uniqueId = crypto.randomUUID();
console.log(uniqueId); 
// 输出类似:"d9bbf5d0-5c5b-4b7c-9c3d-1a1b1c1d1e1f"这种方法的好处:
基于加密安全的随机数
重复概率极低
符合行业标准
现代浏览器和 Node.js 都支持
如果需要短一些的 ID
function generateShortID() {
    return crypto.randomUUID().replace(/-/g, '').substring(0, 12);
}
console.log(generateShortID()); // "d9bbf5d05c5b"数据库主键
const user = {
    id: crypto.randomUUID(),
    name: "张三",
    email: "zhang@example.com"
};
// 保存到数据库
db.users.insert(user);文件上传命名
function handleFileUpload(file) {
    const uniqueFileName = `${crypto.randomUUID()}_${file.name}`;
    
    // 保存文件,确保不会重名
    saveFile(uniqueFileName, file);
}会话管理
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;
}前端列表渲染
function TodoList({ todos }) {
    return (
        <ul>
            {todos.map(todo => (
                <li key={crypto.randomUUID()}>
                    {todo.text}
                </li>
            ))}
        </ul>
    );
}如果因为某些原因不能使用 crypto.randomUUID(),可以考虑这些方法:
使用时间戳加随机数
function generateID() {
    return Date.now() + '_' + Math.random().toString(36).substring(2);
}
// 输出:"1698324567890_abc123def456"使用第三方库
比如使用 uuid 库:
import { v4 as uuidv4 } from 'uuid';
const id = uuidv4();浏览器兼容性
crypto.randomUUID() 在现代浏览器中都支持,但如果要支持老版本浏览器,需要检查兼容性。
Node.js 版本
在 Node.js 中,crypto.randomUUID() 从 16.0 版本开始支持。如果使用更早的版本,可以用:
const { randomUUID } = require('crypto');
const id = randomUUID();ID 长度考虑
标准的 UUID 有 36 个字符,如果存储空间有限,可以考虑生成短一些的 ID。
生成唯一 ID 时,记住这些要点:
不要单独使用 Date.now(),容易重复
优先使用 crypto.randomUUID()
如果需要短 ID,可以截取 UUID 的一部分
考虑使用场景和兼容性
养成使用正确方法生成唯一 ID 的习惯,能让你的应用更加稳定可靠。好的 ID 生成方案就像给数据上了保险,避免很多潜在的问题。
从现在开始,改掉使用 Date.now() 生成 ID 的习惯吧。用 crypto.randomUUID(),一行代码就能解决这个问题,让你的代码更加专业和可靠。
本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!
UUID 的全称是 Universally Unique Identifier,中文为通用唯一识别码。构成:由一组32位数的16进制数字所构成。格式:以连字号分为五段,表现形式为8-4-4-4-12的32个字符
之前代码中前端生成唯一的id方式,一般采用uuid的方式,最近唯一id有了更好的方式,那就是NanoID,今天这篇文章记录一下NanoID 正在取代 UUID?及js 生成uuid及NanoID的方法
UUID:Universally Unique Identifier,通用唯一识别码。目前最广泛应用的UUID,是微软公司的全局唯一标识符GUID。其目的是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。
UUID是软件开发中最常用的通用标识符之一。然而,在过去的几年里,新的替代品挑战了它的存在。其中,ULID 是领先的竞争对手之一,因为它提供可排序的唯一 ID。
UUID 是软件开发中最常用的通用标识符之一。然而,在过去的几年里,其他的竞品挑战了它的存在。其中,NanoID 是 UUID 的主要竞争对手之一。
UUID(Universally Unique IDentifier) 全局唯一标识符。UUID是一种由算法生成的二进制长度为128位的数字标识符。在理想情况下,任何计算机和计算机集群都不会生成两个相同的UUID。
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!