现在我正在从事一个项目,该项目需要每秒多次将整数转换为 base 62 字符串。这种转换完成得越快越好。
问题是我很难让自己的基本转换方法变得快速和可靠。如果我使用字符串,它通常是可靠的并且运行良好,但速度很慢。如果我使用 char 数组,它通常要快得多,但它也非常困惑且不可靠。 (它会产生堆损坏,比较应该匹配的字符串会返回负值等)
那么从一个非常大的整数转换为 base 62 key 的最快和最可靠的方法是什么?将来,我计划在我的应用程序中使用 SIMD 模型代码,那么这个操作是否可以并行化?
编辑:这个操作每秒执行几百万次;一旦操作完成,它将作为循环的一部分再次开始,因此运行得越快越好。被转换的整数是任意大小的,很容易达到 128 位整数(或更大)。
编辑:这是我目前正在使用的功能。
char* charset = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
int charsetLength = (int)(strlen(charset));
//maxChars is an integer specifying the maximum length of the key
char* currentKey = new char[maxChars];
void integerToKey(unsigned long long location)
{
unsigned long long num = location;
int i = 0;
for(; num > 0; i++)
{
currentKey[i] = charset[num % (charsetLength)];
num /= charsetLength + 1;
}
currentKey[i + 1] = '\0';
}
我从我的应用程序的一个类中删除了它,并且修改了一些代码,使其在没有其所属类的情况下有意义。
最佳答案
可能您需要的是某个版本的 itoa。这是一个链接,显示了带有性能测试的 itoa 的各种版本: http://www.strudel.org.uk/itoa/
一般来说,我知道有两种方法可以做到这一点。它执行连续除法以一次剥离一个数字的一种方法。另一种方法是预先计算“ block ”中的转换。因此,您可以预先计算一个 int block 到大小为 62^3 的文本转换,然后一次执行数字 3。如果您有效地进行内存布局和查找,这在运行时可能会稍微快一些,但会导致启动损失。
关于c++ - 最快的碱基转换方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1235371/