1

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

所以,我的问题是,使用 16 个字符的字母(六进制),有:16^24 个可能的 mongo Id,对吗?假设我在 HTTP 请求中使用基于 64 个不同字符([0-9][az][AZ]-_)的 Id,如果我错了,请纠正我,但我认为有 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

4

1 回答 1

1

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

但是您不必将其用作主键。只要不是数组,您就可以在_id字段中使用任何 BSON 数据类型。话虽如此,您可以在 _id 字段中使用您的 20 字符 ID。

编辑:

从您最初的问题中,我不知道您正在使用现有的数据库。_id 字段是不可变的,不能在现有文档中更改。

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

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

于 2014-06-05T08:45:26.583 回答