vue.js js 雪花算法ID生成 vue.js之snowFlake算法

随着前端业务越来越复杂,自定义表单数据量比较大,每条数据的id生成则至关重要。想到前期IOS中实现的雪花算法ID,照着其实现JS版本,供大家学习参考。

一、库的建立引入

在你项目中创建一个snowFlake.js的文件:拷贝以下内容进去。

import bigInt from 'big-integer'export default class SnowFlake {constructor(_workerId=1, _dataCenterId=1, _sequence=0) {// 开始时间截 (2012-01-01),这个可以设置开始使⽤该系统的时间,可往后使⽤69年this.twepoch = 1325347200000;this.workerIdBits = 5;this.dataCenterIdBits = 5;this.maxWorkerId = -1 ^ (-1 << this.workerIdBits) //值为31this.maxDataCenterId = -1 ^ (-1 << this.dataCenterIdBits) //值为31this.sequenceBits = 12;this.workerIdShift = this.sequenceBits; //值为12this.dataCenterIdShift = this.sequenceBits + this.workerIdBits; //17this.timestampLeftShift = this.sequenceBits + this.workerIdBits + this.dataCenterIdBits;//22this.sequenceMask = -1 ^ (-1 << this.sequenceBits);//4095this.lastTimestamp = -1;//设置默认值this.workdId = 1;this.dataCenterId = 1;this.sequence = 0;if (this.workdId > this.maxDataCenterId || this.workdId < 0) {throw new Error('config.worker_id must max than 0 and small than maxWrokerId-[' + this.maxWrokerId + ']');}if (this.dataCenterId > this.maxDataCenterId || this.dataCenterId < 0) {throw new Error('config.data_center_id must max than 0 and small than maxDataCenterId-[' + this.maxDataCenterId + ']');}this.workerId = _workerId;this.dataCenterId = _dataCenterId;this.sequence = _sequence;}tilNextMillis(lastTimestamp) {var timestamp = this.timeGen();while (timestamp <= lastTimestamp) {timestamp = this.timeGen();}return timestamp;}timeGen() {return Date.now();}nextId() {var timestamp = this.timeGen();if (timestamp < this.lastTimestamp) {throw new Error('Clock moved backwards. Refusing to generate id for ' + (this.lastTimestamp - timestamp));}if (this.lastTimestamp === timestamp) {this.sequence = (this.sequence + 1) & this.sequenceMask;if (this.sequence === 0) {timestamp = this.tilNextMillis(this.lastTimestamp);}else {this.sequence = 0;}}this.lastTimestamp = timestamp;var shiftNum = (this.dataCenterId << this.dataCenterIdShift) | (this.workerId << this.workerIdShift) | this.sequence; // dataCenterId:1,workerId:1,sequence:0  shiftNum:135168var nfirst = new bigInt(String(timestamp - this.twepoch), 10);nfirst = nfirst.shiftLeft(this.timestampLeftShift);var nnextId = nfirst.or(new bigInt(String(shiftNum), 10)).toString(10);return nnextId;}/*** 获取更安全的随机ID(解决连续输出id会出现重复的问题)* 尽可能的避免重复* @param {int} repeatRate 重复率默认值100(注释:最⼩是1,最⼤值越⼤,重复的概率越低,不过还需要考虑性能的问题,并不是越⼤越好,只是相对⽽⾔)   */flakeId(repeatRate = 1) {let arr = []let ranNum = Math.floor(window.crypto.getRandomValues(new Uint8Array(1)) * 0.001 * repeatRate)for (let index = 0; index < repeatRate; index++) {arr[index] = this.nextId()}return arr[ranNum]}
}const snowflake = new SnowFlake();export function snowFlakeId(val) {return snowflake.flakeId();
}

因为生成的id比较大,普通的int类型无法保持精度,故而引入了big-integer这个类库。完成以上粘贴事宜后,进入你的项目,安装依赖:

如果你使用的是npm来管理依赖库则运行:

npm install big-integer --save

如果你使用的是yarn(较旧版本)来管理依赖库则运行:

 

yarn install big-integer --save

如果你使用的是yarn(新版本)来管理依赖则运行:

yarn add big-integer --save

后面为什么跟着--save自行查询文档,这里不做说明。

 二、库的使用

        我项目使用生成的页面比较多,为了使用方便,我直接将添加到Vue的扩展方法中。

三、运行验证

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/418833.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud之Nacos的学习、快速上手

1、什么是Nacos Nacos是阿里的一个开源产品&#xff0c;是针对微服务架构中的服务发现、配置管理、服务治理的综合型解决方案&#xff0c;用来实现配置中心和服务注册中心。 Nacos 快速开始 2、安装运行nacos nacos下载地址 下载地址: https://github.com/alibaba/nacos/rel…

【复现】Apache Solr信息泄漏漏洞_24

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 Apache Solr是一个独立的企业级搜索应用服务器&#xff0c;它对外提供类似于Web-service的API接口。用户可以通过http请求&#x…

Spark面试题

1. spark core 1.简述hadoop 和 spark的不同点&#xff08;为什么spark更快&#xff09;♥♥♥ shuffle都是需要落盘的&#xff0c;因为在宽依赖中需要将上一个阶段的所有分区数据都准备好&#xff0c;才能进入下一个阶段&#xff0c;那么如果一直将数据放在内存中&#xff0c…

套接字通信(附带单线程TCP套接字通信代码)

套接字-Socket 1. 概念 1.1 局域网和广域网 局域网&#xff08;LAN&#xff09;和广域网&#xff08;WAN&#xff09;是两种不同范围的计算机网络&#xff0c;它们用于连接多台计算机以实现数据共享和通信。 局域网&#xff08;LAN&#xff09;&#xff1a; 定义&#xff1…

[ tool ] Xpath选择器和selenium工具基本使用

XPath xpath介绍 是一门在XML文档中查找信息的语言 html文档准备 doc <html><head><base hrefhttp://example.com/ /><title>Example website</title></head><body><div idimages><a hrefimage1.html aabb>Name: My…

一键完成,批量转换HTML为PDF格式的方法,提升办公效率

在当今数字化的时代&#xff0c;HTML和PDF已经成为两种最常用的文件格式。HTML用于网页内容的展示&#xff0c;而PDF则以其高度的可读性和不依赖于平台的特性&#xff0c;成为文档分享和传播的首选格式。然而&#xff0c;在办公环境中&#xff0c;我们经常需要在这两种格式之间…

漏洞补丁修复之openssl版本从1.1.1q升级到1.1.1t以及python版本默认2.7.5升级到2.7.18新版本和Nginx版本升级到1.24.0

​ 一、Openssl升级 1、查看Openssl安装的版本 openssl version 2、查看Openssl路径 which openssl 3、上传openssl安装包到服务器:openssl-1.1.1t.tar.gz,并且解压,安装: mv /usr/local/openssl /usr/local/backup_openssl_1.1.1q_20240120 mkdir /usr/local/openssl tar…

AI日报:扎克伯格瞄准AGI通用人工智能

文章目录 Meta瞄准通用人工智能领域Meta的目标Meta的产品 FAIR移动和装载H100扎克伯格对人工智能竞争对手的真实动机持怀疑态度Meta抛弃了元宇宙吗&#xff1f; Meta瞄准通用人工智能领域 Meta首席执行官马克扎克伯格&#xff08;Mark Zuckerberg&#xff09;在一份可能改变全…

2024.1.17 用户画像day02 - Elastic Search

目录 ES和数据库的类比 ELK集中日志协议栈介绍 ES的介绍 ES的架构 ES中的名词 ES中的角色 分片与副本的区别在于: MYSQL分库与分表: 倒排序索引: ES写入数据原理: ES读取、检索数据原理: 重点: ES 的架构 , ES读写的原理 ES和数据库的类比 关系型数据库非关系型数…

百度大脑 使用

百度大脑&#xff1a; 官方网址&#xff1a;https://ai.baidu.com/ 文档中心&#xff1a;https://ai.baidu.com/ai-doc 体验中心&#xff1a;https://ai.baidu.com/experience 百度大脑则是百度AI核心技术引擎&#xff0c;它包括基础层、感知层、认知层和安全&#xff0c;是百…

上门按摩系统的开发对于按摩行业有哪些意义

随着科技的迅猛发展&#xff0c;人们的生活水平逐渐提高&#xff0c;对健康与舒适的需求也日益增强。作为古老而又充满现代感的保健方式&#xff0c;按摩已受到广大民众的喜爱与接纳。然而&#xff0c;传统的按摩店往往需要顾客亲自上门&#xff0c;这对于忙碌的上班族或行动不…