如何用24字符的ObjectId制作20字符的Id



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

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

这似乎是一个经典的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

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

但是您并不强制使用它作为主键。您可以在_id字段中使用任何BSON数据类型,只要不是数组。也就是说,您可以在_id字段中使用20个字符的Id。

编辑:

从你原来的问题,我不知道你正在使用一个现有的数据库。_id字段是不可变的,不能在现有文档中更改。

如果你只想将现有的ObjectId转换为其他20个字符长的方法,你发布的方法将工作。

第二个方法产生一个长字符串因为你基本上是用base64编码一个字符串,它会产生一个更长的字符串

最新更新