GUID
全局唯一标识符(GUID)是一种通过算法生成的标识符,典型的,是通过生成二进制长度为 128 位的数字标识符来作为 GUID, 这样的 GUID 的总数达到了2^128个( 约为万亿亿亿亿个),基本(理论上)能做到全宇宙唯一了。
128 位二进制,表示为16进制字符串形式,长度位 32,形如: 'f30cd0d5-93ab-8225-aa0a-db5372b8f44f'
,其格式的标准定义为:time-low "-" time-mid "-"time-high-and-version "-"clock-seq-and-reserved clock-seq-low "-" node
。
基本上还算简短,能更好的支持对其进行排序,分类,哈希,存储等。GUID 可以用作资源的名称标识,因为其随机分配且唯一,不需要一个统一的注册管理中心,应用起来非常的方便。
Java 语言,直接提供了生成 GUID 的工具,java.util.UUID
,可以通过 UUID.randomUUID()
方法来获取 GUID 值。详细算法说明,可参考 A Universally Unique IDentifier (UUID) URN Namespace
Java 的 UUID 算法实现具有很高的分配速率,可实现单机器每秒种产生千万个UUID。
JS 实现
JS 本身并没有提供 GUID 的实现,需要自己写,一般情况下,不需要按照标准规范来实现,例如:
function GUID() {
function part() {
return Math.floor((1 + Math.random()) * 0x10000)
.toString(16)
.substring(1);
}
return part() + part() + '-' + part() + '-' + part() + '-' + part() + '-' + part() + part() + part();
}
自定义 GUID
根据自身的业务需求,GUID 完全可以灵活定义,只要满足两点即可:
- 第一,全局唯一性;
- 第二,适度的可配置能力;
例外,如果将 GUID 作为主键,也可以通过提升进制数(使用 36 进制,而不是 16 进制),来缩短字符串的长度。
下面,则是自定义的 GUID 实现:
function GUID(typeId = 0, locationId = 0){
function randPart(){
return Math.floor(Math.random()*1000_000+1).toString(36);
}
function timePart(){
return Math.floor(new Date().getTime()/(1000*60)).toString(36); //
}
function customPart(v){
if (typeof v === 'number') return v;
if (typeof v === 'string' && v.trim.length > 0 && v.indexOf('-') === -1) return v;
return 0;
}
return customPart(typeId) + "-" + randPart() + "-" + timePart() + "-" + randPart() + "-" + customPart(locationId);
}