问题描述
是否可以使用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楼
SilentTremor
0
2015-07-31 07:02:05
- 现在,当您需要创建自己的唯一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, ""));
- 或者您可以使用加密随机生成器:
2楼
selbie
0
2016-06-19 07:56:25
指南通常是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;
}