// utils/uuid.js
|
export function generateUUIDv4() {
|
// 优先使用 crypto(更安全),MiniProgram / H5 / Node 环境可能都支持
|
if (typeof crypto !== 'undefined' && crypto.getRandomValues) {
|
const buf = new Uint8Array(16);
|
crypto.getRandomValues(buf);
|
// Per RFC4122 v4
|
buf[6] = (buf[6] & 0x0f) | 0x40;
|
buf[8] = (buf[8] & 0x3f) | 0x80;
|
const hex = Array.from(buf).map(b => b.toString(16).padStart(2, '0')).join('');
|
return `${hex.substr(0,8)}-${hex.substr(8,4)}-${hex.substr(12,4)}-${hex.substr(16,4)}-${hex.substr(20,12)}`;
|
} else {
|
// 备用(兼容性):Math.random 实现(伪随机,注意安全性)
|
let d = new Date().getTime();
|
if (typeof performance !== 'undefined' && typeof performance.now === 'function'){
|
d += performance.now(); // 更好的熵
|
}
|
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
|
const r = (d + Math.random()*16) % 16 | 0;
|
d = Math.floor(d/16);
|
return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
|
});
|
}
|
}
|