我必须生成唯一的URL部分,这对于强力攻击是“不可篡改的”和“抵抗的”。它也必须尽可能短:)并且所有生成的值必须具有相同的长度。我正在考虑使用UUID V4,它可以用32(不带连字符)十六进制字符de305d5475b4431badb2eb6b9e546014
表示,但它有点太长了。所以我的问题是如何生成 unqiue ,可以用 url charcters 表示,每个生成的值具有相同的长度,更短超过32个字符。 (在node.js或pgpsql中)
答案 0 :(得分:2)
v4()
将生成大量数字,该数字将转换为十六进制字符串。在Node.js中,您可以使用Buffer
将字符串转换为较小的base64编码:
import { v4 } from 'uuid';
function getRandomName() {
let hexString = v4();
console.log("hex: ", hexString);
// remove decoration
hexString = hexString.replace("-", "");
let base64String = Buffer.from(hexString, 'hex').toString('base64')
console.log("base64:", base64String);
return base64String;
}
哪个会产生:
hex: 6fa1ca99-a92b-4d2a-aac2-7c7977119ebc
base64: b6HKmakr
hex: bd23c8fd-0f62-49f4-9e51-8b5c97601a16
base64: vSPI/Q9i
答案 1 :(得分:1)
UUID v4本身并不实际保证唯一性。两个随机生成的UUID将发生冲突的可能性非常非常小。这就是为什么他们需要这么长时间 - 这可以减少冲突的机会。 因此,您可以缩短它,但是制作它越短,它实际上不太可能是唯一的。 UUID v4是128位长,因为它通常被认为是“足够独特”。
答案 2 :(得分:0)
这一切都取决于它必须是多么可猜测/独特。
我的建议是生成128个随机位,然后使用base36对其进行编码。这会给你一个“漂亮”的网址,它会是独一无二的,可能还不够。
如果你想要它更短,你可以使用base64,但base64需要包含两个非字母数字字符。
答案 3 :(得分:0)
short-uuid模块就是这样做的。
“生成标准UUID并将其转换为较短的(或只是不同的)格式,然后返回。”
它接受自定义字符集(并提供一些字符集)来回翻译UUID。
您还可以将uuid设置为base64,从而将其缩短为22。这是playground。