如何使用24-char ObjectId生成20-char Id

时间:2014-06-05 08:20:49

标签: mongodb objectid perfect-hash

所以这就是问题:我在我的项目中使用MongoDB,所以有24个字符的ObjectId,只使用十六进制字母表。我在我的项目中向提供商发出http请求,在此请求中我需要为回调目的设置一个唯一的ID,但提供商只允许 20个字符用于此ID,我不知道#39;不知道为什么。

所以,我的问题是,使用16个字符的字母(hexa),有16 ^ 24个可能的mongo ID,对吗? 假设我在HTTP请求中使用基于64个不同字符的Id([0-9] [a-z] [A-Z] -_),  如果我错了,请纠正我,但我认为有64 ^ 20个可能的ID。 从技术上讲,可以使用相应的Id对每个可能的MongoDB ObjectId进行编码,不是吗?

它似乎是一个经典的Base64编码,但神秘的是这不能像我预期的那样工作,我想我不明白Base64编码是如何工作的,因为生成的字符串比原始字符串大......

你认为所有这一切都是可能的,还是我完全错过了什么?

提前致谢!

编辑: 我的一位同事尝试了似乎有用的东西。 这是Java代码:

byte[] decodedHex = Hex.decodeHex("53884594e4b0695f366f8128".toCharArray());
byte[] encodedHexB64 = Base64.encodeBase64(decodedHex);
System.out.println(new String(encodedHexB64)); // --> U4hFlOSwaV82b4Eo

由于我忽略的原因,这样做是不一样的:

String anotherB64 = Base64.encodeBase64String("53884594e4b0695f366f8128".getBytes());
System.out.println(anotherB64);

并打印:NTM4ODQ1OTRlNGIwNjk1ZjM2NmY4MTI4

1 个答案:

答案 0 :(得分:1)

MongoDB使用ObjectId作为文档的默认主键,因为它生成速度快且很可能是唯一的。

但您不必将其用作主键。您可以在_id字段中使用任何BSON数据类型,因为它不是数组。话虽这么说,你可以在_id字段中使用你的20-char Id。

编辑:

根据您的原始问题,我并不知道您正在使用现有的数据库。 _id字段是不可变的,无法在现有文档中更改。

如果您只想将现有的ObjectId转换为其他20个字符长的字符,那么您发布的方法将有效。

第二种方法产生一个长字符串,因为你基本上是对一个字符串进行base64编码,这将产生一个更长的字符串。