生成唯一的ID

本文解析了PHP中的uniqid函数,揭示其生成唯一标识符的具体算法,并探讨了它在实际应用中的潜在用途,如用于文件命名等。
uniqid() 返回一个带前缀的唯一标识基于当前时间精确到微秒。
只是说基于当前时间,但是没有说明与当前时间的关系如何。
echo uniqid();可以看到uniqid始终是一个不断变化的长度为13的十六进制数。
<?php
echo hexdec(uniqid())/(time()+microtime());
?>
输出基本上在1048576左右。
可以断定,uniqid就是当前时间精确到微秒再乘以1048576(2的20次幂)最后转换为十六进制得到的。
知道uniqid与time的关系后uniqid就可以有更广泛的用途了,比如用文本论坛可以用uniqid作为帖子的文件名。

做在帖子索引中,可以很方便的按时间查找帖子。


提示和注释

注释:由于基于系统时间,通过该函数生成的 ID 不是最佳的。如需生成绝对唯一的 ID,请使用 md5() 函数(请在字符串函数参考中查找)。


### 生成唯一 ID 的方法与 `new Array` 的结合使用 在 JavaScript 中,可以通过 `new Array` 生成数组实例,并结合其他方法生成唯一 ID。虽然 `new Array` 本身并不直接生成唯一 ID,但可以通过数组操作和随机数生成等技术实现这一目标。以下是几种常用方法: #### 1. 使用 `new Array` 与 `map` 生成唯一 ID 通过 `new Array` 创建一个固定长度的数组,并结合 `map` 方法生成唯一 ID。例如,可以使用 `Math.random()` 生成随机字符串作为 ID: ```javascript const ids = new Array(5).fill(null).map(() => Math.random().toString(36).slice(2)); console.log(ids); ``` 这种方法利用了 `Math.random()` 生成随机字符串,并通过 `toString(36)` 将其转换为 36 进制字符串,再通过 `slice(2)` 去除前缀 `0.`,从而生成较短的唯一 ID[^4]。 #### 2. 使用 `new Array` 和 `Array.from` 生成 UUID 结合 `Array.from` 可以更灵活地生成 UUID。例如,可以通过指定长度和字符集来生成特定格式的唯一 ID: ```javascript const uuid = Array.from({ length: 36 }, (_, i) => { if (i === 8 || i === 13 || i === 18 || i === 23) return '-'; return Math.floor(Math.random() * 16).toString(16); }).join(''); console.log(uuid); ``` 上述代码生成了一个 36 位的 UUID,其中包含 4 个分隔符 `-`,格式类似于标准的 UUID v4[^5]。 #### 3. 使用 `new Array` 和 `Array.of` 生成基于序列的唯一 ID 如果希望 ID 具有递增特性,可以通过 `Array.of` 结合索引生成唯一 ID: ```javascript const ids = Array.of(1, 2, 3).map((v, i) => `item-${i + 1}`); console.log(ids); ``` 这种方法适用于需要基于数组长度生成递增 ID 的场景,例如 React 列表中的 `key` 属性。 --- ### 注意事项 - **唯一性与性能**:在生成唯一 ID 时,需要权衡唯一性和性能。例如,`Math.random()` 生成ID 虽然具有较高的随机性,但在极端情况下仍有可能重复;而 UUID v4 则具有更强的唯一性,但生成成本略高[^5]。 - **兼容性**:上述方法均适用于现代浏览器,且不依赖任何第三方库,适用于大多数前端和后端(Node.js)环境。 --- ### 相关问题 1. 如何在 JavaScript 中使用 `new Array` 生成基于时间戳的唯一 ID? 2. `Array.from` 在生成唯一 ID 时有哪些优势? 3. 如何确保 `Math.random()` 生成唯一 ID 不重复? 4. 在 React 列表中使用 `new Array` 生成唯一 `key` 的最佳实践是什么? 5. 如何通过 `new Array` 生成具有特定格式的 UUID
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值