Js Snowflake(눈꽃 알고리즘)랜 덤 ID 생 성 방법
import SnowflakeId from "snowflake-id";
const guid = num => {
const id= new SnowflakeId();
return id.generate();
};
2.원생 사용
var Snowflake = /** @class */ (function() {
function Snowflake(_workerId, _dataCenterId, _sequence) {
this.twepoch = 1288834974657n;
//this.twepoch = 0n;
this.workerIdBits = 5n;
this.dataCenterIdBits = 5n;
this.maxWrokerId = -1n ^ (-1n << this.workerIdBits); // :31
this.maxDataCenterId = -1n ^ (-1n << this.dataCenterIdBits); // :31
this.sequenceBits = 12n;
this.workerIdShift = this.sequenceBits; // :12
this.dataCenterIdShift = this.sequenceBits + this.workerIdBits; // :17
this.timestampLeftShift = this.sequenceBits + this.workerIdBits + this.dataCenterIdBits; // :22
this.sequenceMask = -1n ^ (-1n << this.sequenceBits); // :4095
this.lastTimestamp = -1n;
// ,
this.workerId = 1n;
this.dataCenterId = 1n;
this.sequence = 0n;
if(this.workerId > this.maxWrokerId || this.workerId < 0) {
thrownew Error('_workerId must max than 0 and small than maxWrokerId-[' + this.maxWrokerId + ']');
}
if(this.dataCenterId > this.maxDataCenterId || this.dataCenterId < 0) {
thrownew Error('_dataCenterId must max than 0 and small than maxDataCenterId-[' + this.maxDataCenterId + ']');
}
this.workerId = BigInt(_workerId);
this.dataCenterId = BigInt(_dataCenterId);
this.sequence = BigInt(_sequence);
}
Snowflake.prototype.tilNextMillis = function(lastTimestamp) {
var timestamp = this.timeGen();
while(timestamp <= lastTimestamp) {
timestamp = this.timeGen();
}
return BigInt(timestamp);
};
Snowflake.prototype.timeGen = function() {
return BigInt(Date.now());
};
Snowflake.prototype.nextId = function() {
var timestamp = this.timeGen();
if(timestamp < this.lastTimestamp) {
thrownew Error('Clock moved backwards. Refusing to generate id for ' +
(this.lastTimestamp - timestamp));
}
if(this.lastTimestamp === timestamp) {
this.sequence = (this.sequence + 1n) & this.sequenceMask;
if(this.sequence === 0n) {
timestamp = this.tilNextMillis(this.lastTimestamp);
}
} else {
this.sequence = 0n;
}
this.lastTimestamp = timestamp;
return((timestamp - this.twepoch) << this.timestampLeftShift) |
(this.dataCenterId << this.dataCenterIdShift) |
(this.workerId << this.workerIdShift) |
this.sequence;
};
return Snowflake;
}());
console.log(new Snowflake(1n, 1n, 0n).nextId());
//1141531990672150528n
콘 솔 출력 11415319906721528 n 은 bigint 형식 이 고,toString()은 문자열 형식 으로 바 꾸 면 됩 니 다.3.ES6 사용
import bigInt from "big-integer";
const guid = () => {
const Snowflake = /** @class */ (function() {
function Snowflake(_workerId, _dataCenterId, _sequence) {
// this.twepoch = 1288834974657;
this.twepoch = 0;
this.workerIdBits = 5;
this.dataCenterIdBits = 5;
this.maxWrokerId = -1 ^ (-1 << this.workerIdBits); // :31
this.maxDataCenterId = -1 ^ (-1 << this.dataCenterIdBits); // :31
this.sequenceBits = 12;
this.workerIdShift = this.sequenceBits; // :12
this.dataCenterIdShift = this.sequenceBits + this.workerIdBits; // :17
this.timestampLeftShift = this.sequenceBits + this.workerIdBits + this.dataCenterIdBits; // :22
this.sequenceMask = -1 ^ (-1 << this.sequenceBits); // :4095
this.lastTimestamp = -1;
// ,
this.workerId = 1;
this.dataCenterId = 1;
this.sequence = 0;
if (this.workerId > this.maxWrokerId || this.workerId < 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;
}
Snowflake.prototype.tilNextMillis = function(lastTimestamp) {
var timestamp = this.timeGen();
while (timestamp <= lastTimestamp) {
timestamp = this.timeGen();
}
return timestamp;
};
Snowflake.prototype.timeGen = function() {
//new Date().getTime() === Date.now()
return Date.now();
};
Snowflake.prototype.nextId = function() {
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:135168
var 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;
};
return Snowflake;
})();
return new Snowflake(1, 1, 0).nextId();
};
guid()호출 가능4.같은 id 의 bug 를 여러 번 반복 호출 합 니 다.
console.log(guid(), new Date().getTime());
console.log(guid(), new Date().getTime());
console.log(guid(), new Date().getTime());
console.log(guid(), new Date().getTime());
console.log(guid(), new Date().getTime());
console.log(guid(), new Date().getTime());
console.log(guid(), new Date().getTime());
console.log(guid(), new Date().getTime());
console.log(guid(), new Date().getTime());
console.log(guid(), new Date().getTime());
console.log(guid(), new Date().getTime());
console.log(guid(), new Date().getTime());
아래 와 같이 수정 하 다
import SnowflakeId from "snowflake-id";
const guid = num => {
const snowflake = new SnowflakeId();
let arr = [];
for (let i = 0; i < num; i++) {
arr.push(snowflake.generate());
}
return num ? arr : snowflake.generate();
};
단일 호출 guid()n 개 호출 guid(n)
문서.
JS Snowflake(눈꽃 알고리즘)의 랜 덤 ID 생 성 실현 방법 에 관 한 글 을 소개 합 니 다.더 많은 JS 눈꽃 알고리즘 생 성 랜 덤 ID 내용 은 이전 글 을 검색 하거나 아래 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Js를 사용하여 FCKeditor 편집기의 컨텐트 가져오기, 삽입 및 변경이전에 한 시스템에서 FCKeditor 편집기를 사용했는데, 프로젝트 수요로 인해 FCKeditor에 사용자 정의 단추를 추가하여 자신의 수요를 실현하기 위해 주로 이 단추를 눌렀을 때 FCKeditor 편집기의 내...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.