当前位置: 首页 > ds >正文

EasyClick 生成唯一设备码

EasyClick 生成唯一设备码

  • EasyClick 生成唯一设备码

EasyClick 生成唯一设备码

官方的几个函数无法正常获取设备码

device.tcDeviceId 三方统计唯一设备标识
device.getIMEI 获取IMEI

需要自行实现设备码生成过程,然后自行存储验证

/** Copyright(c) 2025,*    项目名称:xxx*    文件名称:createUUID.js*    创建时间:2025/3/7 16:10*    作者:laogui */// 时间戳工具模块(增强版)
let LGTimestampUtils = {/*** 时间戳转Base36(带前导零)* @param {string} timestampStr - 13位时间戳字符串* @returns {string} 8位Base36字符串*/toBase36WithPadding: function (timestampStr) {// 输入校验if (!/^\d{13}$/.test(timestampStr)) {throw new Error('Invalid 13-digit timestamp');}// 直接使用 Number 处理(安全范围内)const num = parseInt(timestampStr, 10);return num.toString(36).padStart(8, '0').slice(-8).toLowerCase();},/*** 生成高熵随机字符串* @param {number} length - 需要生成的字符长度* @returns {string} 随机字符串*/generateHighEntropyRandom: function (length) {const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';const randomBytes = this._getRandomBytes(length);let result = '';for (let j = 0; j < randomBytes.length; j++) {result += chars[randomBytes[j] % chars.length];}return result;},// 私有方法:获取随机字节_getRandomBytes: function (length) {if (typeof crypto !== 'undefined' && crypto.getRandomValues) {const buf = new Uint8Array(length);crypto.getRandomValues(buf);return buf;} else {const arr = [];for (let i = 0; i < length; i++) {arr.push(Math.floor(Math.random() * 256));}return arr;}},/*** 格式化为可读时间* @param {number} timestamp - 13位时间戳* @returns {string} YYYY-MM-DD HH:mm:ss.SSS*/formatReadableTime: function (timestamp) {const date = new Date(timestamp);const pad = (n, len) => n.toString().padStart(len, '0');return `${date.getFullYear()}-${pad(date.getMonth() + 1, 2)}-${pad(date.getDate(), 2)} ` +`${pad(date.getHours(), 2)}:${pad(date.getMinutes(), 2)}:${pad(date.getSeconds(), 2)}.` +pad(date.getMilliseconds(), 3);}
};// 主业务逻辑(增强版)
let LGIdGenerator = {/*** 生成唯一标识符* @param {string} javaTimestamp - Java生成的13位时间戳字符串* @returns {string} 32位ID(8位Base36时间戳 + 24位随机数)*/createUniqueIdentifier: function (javaTimestamp) {return LGTimestampUtils.toBase36WithPadding(javaTimestamp) +LGTimestampUtils.generateHighEntropyRandom(24);},/*** 解码时间戳* @param {string} encodedId - 32位ID* @returns {number} 原始13位时间戳*/decodeEmbeddedTimestamp: function (encodedId) {const base36Str = encodedId.substring(0, 8);return parseInt(base36Str, 36);},/*** 解码并格式化时间* @param {string} encodedId - 32位ID* @returns {string} 格式化后的时间字符串*/decodeAndFormat: function (encodedId) {return LGTimestampUtils.formatReadableTime(this.decodeEmbeddedTimestamp(encodedId));}
};// 使用示例 生成唯一uuid
const uniqueId = LGIdGenerator.createUniqueIdentifier(Date.now().toString());
console.log("Generated ID:", uniqueId);
// 解码生成时间
console.log("Decoded Timestamp:", LGIdGenerator.decodeEmbeddedTimestamp(uniqueId));
// 解码并格式化时间
console.log("Formatted Time:", LGIdGenerator.decodeAndFormat(uniqueId));
http://www.xdnf.cn/news/18926.html

相关文章:

  • 【CV】图像基本操作——①图像的IO操作
  • XC95144XL-10TQG144I Xilinx XC9500XL 高性能 CPLD
  • 从0到1:用 Qwen3-Coder 和 高德MCP 助力数字文旅建造——国庆山西游
  • 我的小灶坑
  • Web程序设计
  • 《 nmcli网络管理学习》
  • 28 FlashAttention
  • sudo 升级
  • 牛客周赛 Round 106(小苯的方格覆盖/小苯的数字折叠/ 小苯的波浪加密器/小苯的数字变换/小苯的洞数组构造/ 小苯的数组计数)
  • “华生科技杯”2025年全国青少年龙舟锦标赛在海宁举行
  • Linux网络套接字
  • 0825 http梳理作业
  • 自由学习记录(88)
  • springboot中操作redis的步骤
  • 将盾CDN:高防CDN和游戏盾有什么区别?
  • 【数据结构】LeetCode160.相交链表 138.随即链表复制 牛客——链表回文问题
  • SQL每日一练
  • 盲盒经济新风口:盲盒抽谷机小程序系统开发全解析
  • 深度学习-----《PyTorch神经网络高效训练与测试:优化器对比、激活函数优化及实战技巧》
  • Telematics Control Unit(TCU)的系统化梳理
  • 数据结构:红黑树(Red-Black Tree)
  • git开发基础流程
  • Springboot应用如何与SkyWalking集成,并使用Docker进行发布
  • Python爬虫实战:研究amazon-scrapy,构建亚马逊电商数据采集和分析系统
  • 扣子智能体商业化卡在哪?井云系统自动化交易+私域管理,闭环成交全流程拆解
  • 小程序开发指南(四)(UI 框架整合)
  • 机器视觉的3C玻璃盖板丝印应用
  • three.js+WebGL踩坑经验合集(8.3):合理设置camera.near和camera.far缓解实际场景中的z-fighting叠面问题
  • 如何在IDEA中使用Git
  • MyBatis-Plus 快速入门 -常用注解