0

我写了一个客户端应用程序。我现在正在为其创建一个后端来保存数据,但对 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 吗?我应该重新生成所有这些吗?

4

3 回答 3

2

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

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

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

于 2012-11-24T22:14:48.153 回答
2

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

于 2012-11-24T22:41:53.140 回答
0

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

于 2012-11-24T23:17:50.877 回答