Javascript 有没有一种方法可以在确保唯一性的同时缩短字符串唯一ID的数组?
我有一个来自Firebase数据库的字符串唯一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标志,该标志将提交散列至少剪切为
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%确定”。。。我没有暗示任何关于安全的事情…:-(对不起,我不是以英语为母语的。。。