用于检查子AskFirebase的唯一值的Firebase安全规则

用于检查子AskFirebase的唯一值的Firebase安全规则,firebase,firebase-realtime-database,firebase-security,Firebase,Firebase Realtime Database,Firebase Security,我的firebase数据库的结构如上图所示。如何确保URL是唯一的,并且没有重复?因为这些是URL,我不能直接将它们用作路径,所以我不得不将它们用作值。因此,像这样的解决方案不起作用。如果您希望Firebase数据库中的某些内容是唯一的,则应将其存储为密钥。这自动保证了唯一性 正如您所指出的,某些字符不能在密钥中使用。在这种情况下,您需要对该值进行编码,以允许它出现在一个键中,并确保不会丢失使该值唯一的信息。一个非常简单的例子是,有人想在数据库中存储一个唯一的电子邮件地址。因为密钥不能包含。字符

我的firebase数据库的结构如上图所示。如何确保URL是唯一的,并且没有重复?因为这些是URL,我不能直接将它们用作路径,所以我不得不将它们用作值。因此,像这样的解决方案不起作用。

如果您希望Firebase数据库中的某些内容是唯一的,则应将其存储为密钥。这自动保证了唯一性

正如您所指出的,某些字符不能在密钥中使用。在这种情况下,您需要对该值进行编码,以允许它出现在一个键中,并确保不会丢失使该值唯一的信息。一个非常简单的例子是,有人想在数据库中存储一个唯一的电子邮件地址。因为密钥不能包含。字符,我们需要对其进行编码。对此的一种常见编码是替换。带着,:

对于电子邮件地址,使用,尤其方便,因为电子邮件地址不能包含

但一般来说,重要的是编码的值被合理地保证是唯一的,并且您仍然将实际值存储在某个地方,比如上面的/users/$uid/email

对于URL编码,我只需从剥离所有非法字符开始:

var url = "http://stackoverflow.com/questions/39149216/firebase-security-rules-to-check-unique-value-of-a-child-askfirebase";
ref.child(url.replace(/[\.\/]/g, '')).set(url);
商店:

"http:stackoverflowcomquestions39149216firebase-security-rules-to-check-unique-value-of-a-child-askfirebase": "http://stackoverflow.com/questions/39149216/firebase-security-rules-to-check-unique-value-of-a-child-askfirebase"
更新:我正在考虑是否对密钥使用简单的哈希代码,这将导致密钥长度更合理:

// from http://stackoverflow.com/questions/7616461/generate-a-hash-from-string-in-javascript-jquery
String.prototype.hashCode = function(){
    var hash = 0;
    if (this.length == 0) return hash;
    for (i = 0; i < this.length; i++) {
        char = this.charCodeAt(i);
        hash = ((hash<<5)-hash)+char;
        hash = hash & hash; // Convert to 32bit integer
    }
    return hash;
}

var url = "http://stackoverflow.com/questions/39149216/firebase-security-rules-to-check-unique-value-of-a-child-askfirebase";

ref.child(url.hashCode()).set(url);

如果希望Firebase数据库中的某些内容是唯一的,则应将其存储为密钥。这自动保证了唯一性

正如您所指出的,某些字符不能在密钥中使用。在这种情况下,您需要对该值进行编码,以允许它出现在一个键中,并确保不会丢失使该值唯一的信息。一个非常简单的例子是,有人想在数据库中存储一个唯一的电子邮件地址。因为密钥不能包含。字符,我们需要对其进行编码。对此的一种常见编码是替换。带着,:

对于电子邮件地址,使用,尤其方便,因为电子邮件地址不能包含

但一般来说,重要的是编码的值被合理地保证是唯一的,并且您仍然将实际值存储在某个地方,比如上面的/users/$uid/email

对于URL编码,我只需从剥离所有非法字符开始:

var url = "http://stackoverflow.com/questions/39149216/firebase-security-rules-to-check-unique-value-of-a-child-askfirebase";
ref.child(url.replace(/[\.\/]/g, '')).set(url);
商店:

"http:stackoverflowcomquestions39149216firebase-security-rules-to-check-unique-value-of-a-child-askfirebase": "http://stackoverflow.com/questions/39149216/firebase-security-rules-to-check-unique-value-of-a-child-askfirebase"
更新:我正在考虑是否对密钥使用简单的哈希代码,这将导致密钥长度更合理:

// from http://stackoverflow.com/questions/7616461/generate-a-hash-from-string-in-javascript-jquery
String.prototype.hashCode = function(){
    var hash = 0;
    if (this.length == 0) return hash;
    for (i = 0; i < this.length; i++) {
        char = this.charCodeAt(i);
        hash = ((hash<<5)-hash)+char;
        hash = hash & hash; // Convert to 32bit integer
    }
    return hash;
}

var url = "http://stackoverflow.com/questions/39149216/firebase-security-rules-to-check-unique-value-of-a-child-askfirebase";

ref.child(url.hashCode()).set(url);

我希望有更好的解决方案,因为通过这种方法,我将不得不替换非法字符,将长度减少到768字节,并进行UTF-8编码。所有这些,同时确保它是独一无二的。到目前为止,创建某种hashid似乎是一个不错的选择。非常感谢你的回复,不客气。实际上,我需要一个类似的内部工具,所以我也在寻找一种从URL获取合理密钥的方法。我希望有更好的解决方案,因为通过这种方法,我将不得不替换非法字符,将长度减少到768字节,并进行UTF-8编码。所有这些,同时确保它是独一无二的。到目前为止,创建某种hashid似乎是一个不错的选择。非常感谢你的回复,不客气。我实际上需要一个内部工具类似的东西,所以我也在寻找一种从URL获取合理密钥的方法。