可以将客户端生成的 guid 直接转换为服务器端、存储它们等吗?没有更高的碰撞风险



我写了一个客户端应用程序。我现在正在为它创建一个后端来保存数据,但对 GUID 实现感到好奇。

客户端,我使用以下 JavaScript 生成一个具有唯一 ID 的 Song 对象。它基于这个StackOverflow帖子。

//Based off of: https://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript
generateGuid: function () {
    var startStringFormat = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';
    var guid = startStringFormat.replace(/[xy]/g, function (c) {
        var r = Math.floor(Math.random() * 16);
        var v = c === 'x' ? r : (r & 0x3 | 0x8);
        return v.toString(16);
    });
    return guid;
},

现在,我在 C# 中定义一个类来表示我的 Song 对象:

public class Song
{
    public virtual Guid Id { get; set; }
    public virtual Guid PlaylistId { get; set; }
    public virtual int VideoId { get; set; }
    public virtual string Url { get; set; }
    public virtual string Title { get; set; }
    public virtual int Duration { get; set; }
}

这样做让我想知道交互 Guid 对象的含义。我可以只获取我在 localStorage 中的所有 Song 对象并直接翻译它们的 Guid 吗?我应该重新生成所有这些吗?

由于 Guid 是唯一的(如果正确生成),因此您可以重用现有 ID。但是要小心,因为恶意客户端当然可以发送任何ID,而不仅仅是随机ID。因此,客户很容易在自己的Guid之间引发碰撞。如果所有善意客户端都随机生成其 Guid,则恶意客户端无法与它们发生冲突。从这个意义上说,Guid 就像一个 128 位密码,它非常强大。

另一方面,生成这些 Guid 的方式不使用加密安全的随机数生成器。所以我想你应该通过向服务器发出 AJAX 调用来让服务器为你提供安全的 Guid。

显示的生成算法对我来说看起来很时髦。您不需要维护任何特定的模式。您可以只生成一个由 100% 随机组件组成的 Guid。

由于您的算法基于 Math.random 生成的伪随机数,并且由于随机数生成器是从当前时间播种的,似乎确实存在冲突的风险。

似乎在某些情况下,您实际上可能会与此方法发生冲突。检查这个问题:在 JavaScript 中生成 UUID 时发生冲突?

最新更新