Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 有没有一种方法可以在确保唯一性的同时缩短字符串唯一ID的数组?_Javascript_Node.js_String_Firebase Realtime Database_Uniqueidentifier - Fatal编程技术网

Javascript 有没有一种方法可以在确保唯一性的同时缩短字符串唯一ID的数组?

Javascript 有没有一种方法可以在确保唯一性的同时缩短字符串唯一ID的数组?,javascript,node.js,string,firebase-realtime-database,uniqueidentifier,Javascript,Node.js,String,Firebase Realtime Database,Uniqueidentifier,我有一个来自Firebase数据库的字符串唯一ID数组,其中一个看起来像这样:QXgZI3JB72Zf1qzeawIdxHSsPa62 我想把这些ID打印给用户,但首先我想把ID的长度缩短到最少7个字符左右,但如果两个缩短的ID最终相等,就让它超过这个长度。这样,如果有人想要引用一个特定的id,他们可以使用缩写版本,而不会意外地引用多个内容 有没有办法做到这一点 为了更好地理解我所说的内容,请参考git命令git rev parse(),该命令具有--short标志,该标志将提交散列至少剪切为

我有一个来自Firebase数据库的字符串唯一ID数组,其中一个看起来像这样:
QXgZI3JB72Zf1qzeawIdxHSsPa62

我想把这些ID打印给用户,但首先我想把ID的长度缩短到最少7个字符左右,但如果两个缩短的ID最终相等,就让它超过这个长度。这样,如果有人想要引用一个特定的id,他们可以使用缩写版本,而不会意外地引用多个内容

有没有办法做到这一点


为了更好地理解我所说的内容,请参考
git
命令
git rev parse
(),该命令具有
--short
标志,该标志将提交散列至少剪切为7个字符长(但如果不再唯一,则允许该散列更长):

不要输出对象名称的完整SHA-1值,而是尝试将它们缩写为较短的唯一名称


我认为没有安全的方法可以在生成唯一ID后缩短它们(CMIIAW)

ids的无唯一性由中央服务器来保证:在发生冲突的情况下,它将重新计算不同的id,直到它唯一为止

如果您在发出ID后缩短了它们,则无法100%保证它们是唯一的,如果您不想重播服务器的作业,请保留一个ID数据库


正如您所说的,
git--short
打印提交ID的缩短版本,但如果不再是唯一的,它将允许更长的提交ID…

问题中缺少的是您是否愿意保留一个查找表,或者,如果您正在寻找一种双向编码方法,其中长字符串通过算法编码为短字符串,然后可以解码为原始字符串

如果是后者,那么祝你好运,如果/当你找到答案时,请在这里发布你的答案

否则,只需对键/值对进行散列:

var dbKeyHash = { "xyz":"QXgZI3JB72Zf1qzeawIdxHSsPa62",
   ...
}
键可以是递增的数字,也可以是任何其他简短但唯一的字符串。浏览数据库键列表时,可以随机生成一个短字符串,如果它不在哈希中,则使用它,否则,生成另一个并继续

然后,当用户引用您显示的其中一个短键时,您只需在哈希中查找该值:

var dbKey = dbKeyHash['xyz'] // QXgZI3JB72Zf1qzeawIdxHSsPa62

就生成短字符串而言,您可能会在该线程中找到一些好方法:

是的,有一种方法可以实现这一点(实际上,有许多不同的方法)。你试过什么?你被卡在哪里了?我在考虑对数组的每个字符串进行切片,检查所有字符串是否相等,然后再对相等的字符串进行切片。在我这么做之前,我只是想知道我正在尝试做的事情是否有一个名字,是否有一个库已经做得比我刚才描述的要好得多。(当然,除非答案很简单,最好是自己去做。)您是想确保永久的唯一性(跨多个调用),还是只在一个页面上?有什么理由你真的需要为用户列出ID,而不是让他们点击链接或类似的东西吗?@octopod我想你的搜索词应该包括“唯一前缀”。@jcaron:最好是这样,因为这实际上是一个node.js过程(为错误标记道歉)据我所知,引用Firebase数组中特定对象的唯一方法是知道整个标识符(除非我将其从数据库读入数组并通过其索引引用对象,但如果我稍后更改其顺序会怎么样?)。虽然,你有一个观点,一旦我把它们用于一个网站,我可能应该使用链接代替。在这种情况下,安全不是问题。这些标识符只是指数组的索引,因为Firebase中的
.push()
函数没有为其分配数组索引,而是为其分配一个唯一标识符(经过一些工作后,实际上并不重要,因为
.forEach()
确保了数组顺序)。里面的信息一点也不敏感;任何人都可以看到。我用“安全”来表示“100%确定”。。。我没有暗示任何关于安全的事情…:-(对不起,我不是以英语为母语的。。。