当前位置: 代码迷 >> JavaScript >> Node / JavaScript中的十六进制全局唯一标识符(GUID)算法
  详细解决方案

Node / JavaScript中的十六进制全局唯一标识符(GUID)算法

热度:148   发布时间:2023-06-05 11:52:44.0

是否可以使用16个字符的十六进制创建GUID? 我问的原因是Cloudflare使用16个字符来标识对其系统的每个请求(它们称为“射线ID”)。 与其他GUID格式相比,它们看起来更好(我知道这是愚蠢的选择)。

密钥空间将包含以下字符:

0-9
a-f
---
16 total possible characters

Example: adttlo9dOd8haoww

另外,对生成这些东西的基本算法的任何提示都是很棒的。

最后,我愿意保留“十六进制”格式并使用:

0-9
a-z
A-Z
---
62 total possible characters

Example: dhmpLTuPFWEwM8UL
  1. 现在,当您需要创建自己的唯一ID的使用日期时。 如果您的应用程序是分布式的,则使用datetime.now +节点标识符,这是最简单的解决方案:

 function d2h(d) { return d.toString(16); } function h2d (h) { return parseInt(h, 16); } function stringToHex (tmp) { var str = '', i = 0, tmp_len = tmp.length, c; for (; i < tmp_len; i += 1) { c = tmp.charCodeAt(i); str += d2h(c) + ' '; } return str; } function hexToString (tmp) { var arr = tmp.split(' '), str = '', i = 0, arr_len = arr.length, c; for (; i < arr_len; i += 1) { c = String.fromCharCode( h2d( arr[i] ) ); str += c; } return str; } //if you can get utc time is even bether // Tue, 30 Jun 2015 23:01:04 GMT var time = Date(); var server_point = "S1"; //you can encript this genrated id with blow fish or something, remember encripting existen bytes the length of the result wil grow //remove spaces var reg = new RegExp("[ ]+","g"); time = time.replace(reg, ""); var hexaResult = stringToHex(time + server_point); alert(hexaResult.replace(reg, "")); 

  1. 或者您可以使用加密随机生成器:

指南通常是32个十六进制字符,并在不同的时间间隔以短划线表示。

var crypto = require("crypto");

function create_guid() {
    var hexstring = crypto.randomBytes(16).toString("hex"); // 16 bytes generates a 32 character hex string
    var guidstring = hexstring.substring(0,8) + "-" + hexstring.substring(8,12) + "-" + hexstring.substring(12,16) + "-" + hexstring.substring(16,20) + "-" + hexstring.substring(20);
    return guidstring;
}

如果您不想使用破折号,则可以简单地修改上面的函数以返回hexstring guidstring而不是guidstring 如果只需要16个字符而不是32个字符:

function create_guid_simple() {
    var hexstring = crypto.randomBytes(8).toString("hex"); // 8 bytes is a 16 character string
    return hexstring;
}
  相关解决方案