3

我正在寻找将 MongoDB id504aaedeff558cb507000004转换为更短的表示形式的最佳方法PHP?基本上,用户可以在应用程序中引用 id,而那个长字符串很难。

一个警告是,碰撞应该是“罕见的”。我们能否以某种方式将其缩减为 4、5 或 6 个字符?

谢谢。

4

2 回答 2

1

虽然一个十六进制数字可以存储 16 种不同的状态,但一个 base64 编码的数字可以存储 64 种不同的状态,因此您可以将整个 MongoDB Id 存储为 16 位而不是 24 位,而不会丢失任何信息:

print hexToBase64("50b3701de3de2a2416000000") . "\n"; # -> ULNwHePeKiQWAAAA
print base64ToHex("ULNwHePeKiQWAAAA") . "\n";         # -> 50b3701de3de2a2416000000

function base64ToHex($string) {
  return bin2hex(base64_decode($string));
}

function hexToBase64($string) {
  return base64_encode(hex2bin($string));
}
于 2012-11-27T12:43:54.740 回答
0

您开始时的唯一 ID 可以由 映射[0-9a-f]。缩短可以通过多种方式完成 - 一种简单的方法是重新映射字符集。

我们的目标是通过替换字符将字符串大小一分为二。一个字符是 16 个字符之一,所以两个字符给你 16^2 = 256 种可能性……我相信你知道我要去哪里。取字符串中的每一对字符,并计算映射值。生成对应的 ASCII 字符,用这个代替。如果您不喜欢最后有这么丑陋的 ID,请对其进行 base64 编码 - 您将得到一个比您开始使用的字符串短大约 1/3 的字符串。

于 2012-11-18T22:10:08.890 回答