如何缩短UUID V4而不使其成为非唯一/可猜测的

时间:2015-07-30 13:55:42

标签: node.js postgresql cryptography probability uuid

我必须生成唯一的URL部分,这对于强力攻击是“不可篡改的”和“抵抗的”。它也必须尽可能短:)并且所有生成的值必须具有相同的长度。我正在考虑使用UUID V4,它可以用32(不带连字符)十六进制字符de305d5475b4431badb2eb6b9e546014表示,但它有点太长了。所以我的问题是如何生成 unqiue ,可以用 url charcters 表示,每个生成的值具有相同的长度更短超过32个字符。 (在node.js或pgpsql中)

4 个答案:

答案 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