자바 펼쳐 시간으로 고유 번호 만들기
자바 펼쳐를 사용하여 즉시 고유 한 ID 번호를 생성해야합니다. 과거에는 시간을 사용하여 숫자를 생성하여 작업을 수행했습니다. 숫자는 4 자리 연도, 2 자리 월, 2 자리 일, 2 자리시, 2 자리 분, 2 자리 초 및 3 자리 밀리 초로 구성됩니다. 따라서 다음과 같이 보일 것입니다. 20111104103912732 ... 이것은 내 목적에 맞는 고유 번호에 대한 확실성을 제공합니다.
이 일을 한 지 오래 더 이상 코드가 없습니다. 누구 든지이 작업을 수행 할 수있는 코드가 작업 수행 고유 ID 생성에 대한 더 나은 제안이 있습니까?
고유 한 번호를 원하면
var timestamp = new Date().getUTCMilliseconds();
간단한 숫자를 얻을 수 있습니다. 그러나 읽을 수있는 버전이 필요한 경우 약간의 처리가 필요합니다.
var now = new Date();
timestamp = now.getFullYear().toString(); // 2011
timestamp += (now.getFullMonth < 9 ? '0' : '') + now.getFullMonth().toString(); // JS months are 0-based, so +1 and pad with 0's
timestamp += (now.getDate < 10) ? '0' : '') + now.getDate().toString(); // pad with a 0
... etc... with .getHours(), getMinutes(), getSeconds(), getMilliseconds()
더 나은 접근 방식은 다음과 가변합니다.
new Date().valueOf();
대신에
new Date().getUTCMilliseconds();
valueOf () 는 "거의"고유 한 숫자입니다. http://www.w3schools.com/jsref/jsref_valueof_date.asp .
생각할 수있는 한 많은 식별 인스턴스 만드는 고유 할 수있는 번호를 가장 짧은 방법은 다음과 같습니다.
Date.now() + Math.random()
함수 호출에 1 초 차이가 밀리 있으면 다른 숫자를 생성하는 것이 100 % 보장됩니다 . 동일한 밀리 초 내의 호출 함수 호출의 경우이 동일한 밀리 초 고유 수백만 개 이상의 숫자를 생성하는 경우에만 걱정하기 시작해야합니다. 이는 그다지 가능성이 없습니다.
동일한 밀리 초 복제되는 숫자를 얻을 확률에 대한 자세한 내용은 https://stackoverflow.com/a/28220928/4617597을 참조 하십시오.
다음 코드를 사용하여 간단히 수행 할 수 있습니다.
var date = new Date();
var components = [
date.getYear(),
date.getMonth(),
date.getDate(),
date.getHours(),
date.getMinutes(),
date.getSeconds(),
date.getMilliseconds()
];
var id = components.join("");
여러 숫자보다 작은 것을 원할 때 내가하는 일은 다음과 가능합니다.
var uid = (new Date().getTime()).toString(36)
이것은 Date
인스턴스를 만드는 것보다 더 빠른 수행되고, 더 약간 코드를 사용하며, 항상 (로컬에서) 고유 번호를 생성합니다.
function uniqueNumber() {
var date = Date.now();
// If created at same millisecond as previous
if (date <= uniqueNumber.previous) {
date = ++uniqueNumber.previous;
} else {
uniqueNumber.previous = date;
}
return date;
}
uniqueNumber.previous = 0;
jsfiddle : http://jsfiddle.net/j8aLocan/
나는 Bower와 npm에서 공개했습니다 : https://github.com/stevenvachon/unique-number
cuid , puid 또는 shortid 와 같은 좀 더 정교한 것을 사용 하여 숫자가 아닌 것을 생성 할 수도 있습니다 .
나는 사용한다
Math.floor(new Date().valueOf() * Math.random())
따라서 혹시라도 코드가 동시에 실행되면 난수가 동일 할 가능성이 아주 작습니다.
온라인 조사에서 세션 당 고유 ID를 생성하는 다음 개체를 얘기합니다.
window.mwUnique ={
prevTimeId : 0,
prevUniqueId : 0,
getUniqueID : function(){
try {
var d=new Date();
var newUniqueId = d.getTime();
if (newUniqueId == mwUnique.prevTimeId)
mwUnique.prevUniqueId = mwUnique.prevUniqueId + 1;
else {
mwUnique.prevTimeId = newUniqueId;
mwUnique.prevUniqueId = 0;
}
newUniqueId = newUniqueId + '' + mwUnique.prevUniqueId;
return newUniqueId;
}
catch(e) {
mwTool.logError('mwUnique.getUniqueID error:' + e.message + '.');
}
}
}
어떤 사람들에게 도움이 될 수 있습니다.
건배
앤드류
이렇게해야합니다.
var uniqueNumber = new Date().getTime(); // milliseconds since 1st Jan. 1970
ES6에서 :
const ID_LENGTH = 36
const START_LETTERS_ASCII = 97 // Use 64 for uppercase
const ALPHABET_LENGTH = 26
const uniqueID = () => [...new Array(ID_LENGTH)]
.map(() => String.fromCharCode(START_LETTERS_ASCII + Math.random() * ALPHABET_LENGTH))
.join('')
예 :
> uniqueID()
> "bxppcnanpuxzpyewttifptbklkurvvetigra"
또한 다음을 수행해야합니다.
(function() {
var uniquePrevious = 0;
uniqueId = function() {
return uniquePrevious++;
};
}());
내 자신의 코드 참조를 위해 여기 에이 코드 스 니펫을 게시합니다 (보장되지는 않지만 충분히 "고유 한"것으로 충분 함).
// a valid floating number
window.generateUniqueNumber = function() {
return new Date().valueOf() + Math.random();
};
// a valid HTML id
window.generateUniqueId = function() {
return "_" + new Date().valueOf() + Math.random().toFixed(16).substring(2);
};
이렇게하면 거의 보장 된 고유 한 32 자 키 클라이언트 쪽이 생성됩니다. 숫자 만 원하는 경우 "chars"var를 변경합니다.
var d = new Date().valueOf();
var n = d.toString();
var result = '';
var length = 32;
var p = 0;
var chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
for (var i = length; i > 0; --i){
result += ((i & 1) && n.charAt(p) ? '<b>' + n.charAt(p) + '</b>' : chars[Math.floor(Math.random() * chars.length)]);
if(i & 1) p++;
};
https://jsfiddle.net/j0evrdf1/1/
function UniqueValue(d){
var dat_e = new Date();
var uniqu_e = ((Math.random() *1000) +"").slice(-4)
dat_e = dat_e.toISOString().replace(/[^0-9]/g, "").replace(dat_e.getFullYear(),uniqu_e);
if(d==dat_e)
dat_e = UniqueValue(dat_e);
return dat_e;
}
호출 1 : UniqueValue ( '0')
호출 2 : UniqueValue (UniqueValue ( '0')) // 복잡합니다.
샘플 출력 :
for (var i = 0; i <10; i ++) {console.log (UniqueValue (UniqueValue ( '0')));}
60950116113248802
26780116113248803
53920116113248803
35840116113248803
47430116113248803
41680116804113248803
42980116113248804
34750116730248804
20950116804113804 03730116113804 20950116804113804 03730116113804 20950116804113804
03730116113804 20950116804804
Date.now()
몇 밀리 초 후에 고유 번호 를 사용하고 내부에서 for loop
사용하는 것과 Date.now() and Math.random()
함께 사용하십시오.
for 루프 내의 고유 번호
function getUniqueID(){
for(var i = 0; i< 5; i++)
console.log(Date.now() + ( (Math.random()*100000).toFixed()))
}
getUniqueID()
출력 :: 모든 숫자는 고유합니다.
15598251485988384 155982514859810330 155982514859860737 155982514859882244 155982514859883316
없는 고유 번호 Math.random()
function getUniqueID(){
for(var i = 0; i< 5; i++)
console.log(Date.now())
}
getUniqueID()
출력 :: 숫자가 반복됩니다.
1559825328327 1559825328327 1559825328327 1559825328328 1559825328328
@abarber가 제안한 솔루션 (new Date()).getTime()
이 밀리 초의 창 tick
을 사용하고이 간격에서 충돌이 발생 하는 경우 a 를 합산 하기 때문에 좋은 솔루션이라고 가정하면 여기에서 명확하게 볼 수 있듯이 내장형을 사용할 수 있습니다.
다음을 사용하여 1/1000 창 프레임에서 충돌이 발생할 수있는 방법을 여기서 확인할 수 있습니다 (new Date()).getTime()
.
console.log( (new Date()).getTime() ); console.log( (new Date()).getTime() )
VM1155:1 1469615396590
VM1155:1 1469615396591
console.log( (new Date()).getTime() ); console.log( (new Date()).getTime() )
VM1156:1 1469615398845
VM1156:1 1469615398846
console.log( (new Date()).getTime() ); console.log( (new Date()).getTime() )
VM1158:1 1469615403045
VM1158:1 1469615403045
두 번째로 1/1000 창에서 충돌을 방지하는 제안 된 솔루션을 시도합니다.
console.log( window.mwUnique.getUniqueID() ); console.log( window.mwUnique.getUniqueID() );
VM1159:1 14696154132130
VM1159:1 14696154132131
즉 process.nextTick
, 이벤트 루프에서 호출 되는 노드와 같은 함수를 단일 로 사용하는 것을 고려할 수 있으며 여기에tick
잘 설명되어 있습니다 . 물론 브라우저에는 없어서 process.nextTick
어떻게해야하는지 알아 내야합니다. 이 구현이 설치할 nextTick
수있는 브라우저에서 I / O에 가장 가까운 기능을 사용하여 브라우저의 기능을 setTimeout(fnc,0)
, setImmediate(fnc)
, window.requestAnimationFrame
. 여기에 제안 된대로를 추가 할 수 있지만는 window.postMessage
필요하기 때문에 독자에게 남겨 둡니다 addEventListener
. 여기에서 더 간단하게 유지하기 위해 원래 모듈 버전을 수정했습니다.
getUniqueID = (c => {
if(typeof(nextTick)=='undefined')
nextTick = (function(window, prefixes, i, p, fnc) {
while (!fnc && i < prefixes.length) {
fnc = window[prefixes[i++] + 'equestAnimationFrame'];
}
return (fnc && fnc.bind(window)) || window.setImmediate || function(fnc) {window.setTimeout(fnc, 0);};
})(window, 'r webkitR mozR msR oR'.split(' '), 0);
nextTick(() => {
return c( (new Date()).getTime() )
})
})
따라서 우리는 1/1000 창에 있습니다.
getUniqueID(function(c) { console.log(c); });getUniqueID(function(c) { console.log(c); });
undefined
VM1160:1 1469615416965
VM1160:1 1469615416966
이것을 사용하십시오 : 자바 스크립트에서 고유 번호를 만들려면
var uniqueNumber=(new Date().getTime()).toString(36);
이것은 진짜 작동한다. :)
getTime () 또는 valueOf ()를 사용하는 것이 더 좋을 수도 있지만 이렇게하면 고유하고 사람이 이해할 수있는 숫자 (날짜 및 시간을 나타냄)를 반환합니다.
window.getUniqNr = function() {
var now = new Date();
if (typeof window.uniqCounter === 'undefined') window.uniqCounter = 0;
window.uniqCounter++;
var m = now.getMonth(); var d = now.getDay();
var h = now.getHours(); var i = now.getMinutes();
var s = now.getSeconds(); var ms = now.getMilliseconds();
timestamp = now.getFullYear().toString()
+ (m <= 9 ? '0' : '') + m.toString()
+( d <= 9 ? '0' : '') + d.toString()
+ (h <= 9 ? '0' : '') + h.toString()
+ (i <= 9 ? '0' : '') + i.toString()
+ (s <= 9 ? '0' : '') + s.toString()
+ (ms <= 9 ? '00' : (ms <= 99 ? '0' : '')) + ms.toString()
+ window.uniqCounter;
return timestamp;
};
window.getUniqNr();
let now = new Date();
let timestamp = now.getFullYear().toString();
let month = now.getMonth() + 1;
timestamp += (month < 10 ? '0' : '') + month.toString();
timestamp += (now.getDate() < 10 ? '0' : '') + now.getDate().toString();
timestamp += (now.getHours() < 10 ? '0' : '') + now.getHours().toString();
timestamp += (now.getMinutes() < 10 ? '0' : '') + now.getMinutes().toString();
timestamp += (now.getSeconds() < 10 ? '0' : '') + now.getSeconds().toString();
timestamp += (now.getMilliseconds() < 100 ? '0' : '') + now.getMilliseconds().toString();
밀리 초는 노드에서 밀리 초마다 업데이트되지 않으므로 다음은 대답입니다. 이렇게하면 사람이 읽을 수있는 고유 한 티켓 번호가 생성됩니다. 저는 프로그래밍과 nodejs를 처음 사용합니다. 내가 틀렸다면 나를 바로 잡으십시오.
function get2Digit(value) {
if (value.length == 1) return "0" + "" + value;
else return value;
}
function get3Digit(value) {
if (value.length == 1) return "00" + "" + value;
else return value;
}
function generateID() {
var d = new Date();
var year = d.getFullYear();
var month = get2Digit(d.getMonth() + 1);
var date = get2Digit(d.getDate());
var hours = get2Digit(d.getHours());
var minutes = get2Digit(d.getMinutes());
var seconds = get2Digit(d.getSeconds());
var millSeconds = get2Digit(d.getMilliseconds());
var dateValue = year + "" + month + "" + date;
var uniqueID = hours + "" + minutes + "" + seconds + "" + millSeconds;
if (lastUniqueID == "false" || lastUniqueID < uniqueID) lastUniqueID = uniqueID;
else lastUniqueID = Number(lastUniqueID) + 1;
return dateValue + "" + lastUniqueID;
}
쉽고 항상 고유 한 가치를 얻으십시오.
const uniqueValue = (new Date()).getTime() + Math.trunc(365 * Math.random());
**OUTPUT LIKE THIS** : 1556782842762
나는 이렇게했다
function uniqeId() {
var ranDom = Math.floor(new Date().valueOf() * Math.random())
return _.uniqueId(ranDom);
}
function getUniqueNumber() {
function shuffle(str) {
var a = str.split("");
var n = a.length;
for(var i = n - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
return a.join("");
}
var str = new Date().getTime() + (Math.random()*999 +1000).toFixed() //string
return Number.parseInt(shuffle(str));
}
위의 #Marcelo Lazaroni 솔루션과 관련하여
Date.now() + Math.random()
이 1567507511939.4558 (소수점 4 개로 제한됨)과 같은 숫자를 반환하고 0.1 %마다 고유하지 않은 숫자 (또는 충돌)를 제공합니다.
toString ()을 추가하면이 문제가 해결됩니다.
Date.now() + Math.random().toString()
'15675096840820.04510962122198503'(문자열)을 반환하고 '동일한'밀리 초를 얻지 못할 정도로 '느리다'.
참고 URL : https://stackoverflow.com/questions/8012002/create-a-unique-number-with-javascript-time
'IT' 카테고리의 다른 글
ellipsize = "marquee"를 항상 스크롤하는 방법이 있습니까? (0) | 2020.09.06 |
---|---|
UITableView 명확한 배경 (0) | 2020.09.06 |
Java에서 부울 변수의 크기는 얼마입니까? (0) | 2020.09.06 |
Swift에서 NSMutableAttributedString을 사용하여 특정 텍스트의 색상 변경 (0) | 2020.09.06 |
axios에서 헤더 및 옵션을 설정하는 방법은 무엇입니까? (0) | 2020.09.06 |