将MongoDB id减少为更短的哈希值

时间:2012-09-09 05:19:05

标签: php hash

我正在寻找将MongoDB ID 504aaedeff558cb507000004转换为PHP中较短代表的最佳方式?基本上,用户可以在应用程序中引用id,并且那个长字符串很难。

唯一需要注意的是,碰撞应该是“罕见的”。我们能以某种方式将它降低到4,5或6个字符吗?

感谢。

2 个答案:

答案 0 :(得分: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));
}

答案 1 :(得分:0)

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

我们的目标是通过替换字符将字符串大小减少到两个。一个字符是16个中的一个,所以两个字符给你16 ^ 2 = 256种可能性......我相信你知道我要去哪里。记下字符串中的每个字符,并计算映射值。生成相应的ASCII字符,然后使用它。如果你不喜欢在最后有这样一个丑陋的ID,对它进行base64编码 - 你会得到一个大约比你开始时短1/3的字符串。