我是Firebase的新手,我想在将新数据推送到数据库时拥有自己的密钥。

javascript - 将新数据推送到Firebase数据库时设置自定义数字键-LMLPHP

现在,我正在使用以下内容。

uid(FirebaseAuth.getInstance().getCurrentUser().getUid())


但是我想创建自己的ID,它必须是一个数字值。

如何在那里创建自己的自定义密钥?如0001,0002等

我在这里问是因为我正在从事在线购物项目。当用户将产品添加到其库存时,需要为每个产品分配一个ID。如果不可能,那就告诉我,我可以接受。

最佳答案

您可以简单地执行push()函数。要做的是为您的节点创建一个随机ID。

databaseRef.push(); // You have created a node with a random id.


但是,如果要创建具有数字ID的节点,则可以使用一个函数来创建数字值:

public static long generateRandom(int length) {
    Random random = new Random();
    char[] digits = new char[length];
    digits[0] = (char) (random.nextInt(9) + '1');
    for (int i = 1; i < length; i++) {
        digits[i] = (char) (random.nextInt(10) + '0');
    }
    return Long.parseLong(new String(digits));
}


该函数来自:12 Digit unique random number generation in Java

您传递一个长度,它将创建一个随机数值。理想的长度是5。然后您可以执行以下操作:

long randomFiveDigitValue = generateRandom(5);
databaseRef.child(String.valueOf(randomFiveDigitValue)).setValue(your_object);


另一种选择是使用整数哈希码。这样可以减少哈希冲突,但是您也应该像以前的函数一样准备好处理它们。您可以从订单中获取一个标识符,例如日期或什至多种因素,然后执行以下操作:

//Replace all these variables with the respective value
String factors = "your_date" + "user_uid" + "product_name";
factors.hashCode(); //String date returns a integer hash value.


以下是随机生成的hashCode()产品的50000冲突:

COLLISIONS BETWEEN: 2 Items
ITEM 1: DATE: 24-5-2019 08:09 PM + NAME: IPHONE + UID: 4J3IF93KSKK0295[L3
ITEM 2: DATE: 24-5-2019 09:08 PM + NAME: MARKER + UID: 534KKJI903[PCO4OP5


生成这些花了很长时间,我认为现在碰撞真的很罕见。就像1 to 50000 ratio。我的算法可能有缺陷,但是通过这种方式,冲突确实很少。

07-27 19:20