将新数据推送到firebase数据库时设置自定义数字键

Posted

技术标签:

【中文标题】将新数据推送到firebase数据库时设置自定义数字键【英文标题】:Setting custom numeric key when pushing new data to firebase database 【发布时间】:2019-12-15 05:26:28 【问题描述】:

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

您可以简单地执行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.

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

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。我的算法可能有缺陷,但这样的碰撞仍然很低。

【讨论】:

感谢您的回复.. 当许多用户同时使用时。如果有任何数据冲突的可能性.. 示例两个成员获得相同的 id 你可以通过增加位数来减少机会。 是的,当然有碰撞的可能。您可以增加位数以降低冲突率,但是,这是有可能的。而且,如果数字长于12位,那么我猜它仍然存在人类可读性的问题。我认为唯一的哈希键比 12 位以上的数字要好。 同意。但他希望在线商店中的对象有一个数值。 我理解你的意图。答案很好。但是,由于为库存参考 ID 选择了坏键,整个事情可能会被搞砸。我可能有不同的设计。

以上是关于将新数据推送到firebase数据库时设置自定义数字键的主要内容,如果未能解决你的问题,请参考以下文章

推送到firebase数据库时如何设置推送键?

如何将新数据从实时数据库推送到 Cloud Firestore?

将新数据从 Node REST API 推送到 React-Native

iPhone - 单元格内的按钮将新视图推送到屏幕上

将新映像推送到 ECR 存储库时如何自动部署到 ECS Fargate

仅将新数据从服务器推送到 iPad