gpt4 book ai didi

c++ - 在 C++ 中将 md5 字符串转换为 base 62 字符串

转载 作者:太空宇宙 更新时间:2023-11-04 15:27:59 24 4
gpt4 key购买 nike

我正在尝试将 md5 字符串(基数 16)转换为 C++ 中的基数 62 字符串。到目前为止,我发现的每个转换为 base 62 的解决方案只有在您可以将您的数字表示为 64 位或更小的整数时才有效。一个 md5 字符串是 128 位,我自己无法解决这个问题。

我应该只包含一个 bigint 库并完成它吗?

最佳答案

让我们看看。 128/log2(62)=21.497。这意味着您需要 22 个“数字”来表示 base-62。

如果您只对不超过 22 个字符且不使用超过 62 个不同字符的字符串表示形式感兴趣,则您不需要真正的 base-62 表示形式。您可以将 128 位分成更小的部分并分别编码。这样你就不需要任何 128 位算术。您可以将 128 位拆分为 2x64 位,并使用长度为 11 的字符串对每个 64 位 block 进行编码。即使仅使用 57 个不同的字符也可以这样做。因此,您可以消除 62 个字符中的 5 个来避免任何“视觉歧义”。例如,删除 l,1,B,8。剩下 58 个不同的字符和 11*log2(58)=64.438 刚好足以编码 64 位。

获取两个 64 位 block 并不难:

#include <climits>

#if CHAR_BIT != 8
#error "platform not supported, CHAR_BIT==8 expected"
#endif

// 'long long' is not yet part of C++
// But it's usually a supported extension
typedef unsigned long long uint64;

uint64 bits2uint64_bigendian(unsigned char const buff[]) {
return (static_cast<uint64>(buff[0]) << 56)
| (static_cast<uint64>(buff[1]) << 48)
| (static_cast<uint64>(buff[2]) << 40)
| (static_cast<uint64>(buff[3]) << 32)
| (static_cast<uint64>(buff[4]) << 24)
| (static_cast<uint64>(buff[5]) << 16)
| (static_cast<uint64>(buff[6]) << 8)
| static_cast<uint64>(buff[7]);
}

int main() {
unsigned char md5sum[16] = {...};
uint64 hi = bits2uint64_bigendian(md5sum);
uint64 lo = bits2uint64_bigendian(md5sum+8);
}

关于c++ - 在 C++ 中将 md5 字符串转换为 base 62 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4007280/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com