У меня есть функция, которую я написал для преобразования 64-разрядного целого числа в базовую 62 строку. Первоначально я добился этого примерно так:
char* charset = " 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
int charsetLength = strlen(charset);
std::string integerToKey(unsigned long long input)
{
unsigned long long num = input;
string key = "";
while(num)
{
key += charset[num % charsetLength];
num /= charsetLength;
}
return key;
}
Однако это было слишком медленно.
Я улучшил скорость, предоставив возможность генерировать справочную таблицу. Таблица имеет размер около 62 4 строк и генерируется следующим образом:
// Create the integer to key conversion lookup table
int lookupChars;
if(lookupDisabled)
lookupChars = 1;
else
largeLookup ? lookupChars = 4 : lookupChars = 2;
lookupSize = pow(charsetLength, lookupChars);
integerToKeyLookup = new char*[lookupSize];
for(unsigned long i = 0; i < lookupSize; i++)
{
unsigned long num = i;
int j = 0;
integerToKeyLookup[i] = new char[lookupChars];
while(num)
{
integerToKeyLookup[i][j] = charset[num % charsetLength];
num /= charsetLength;
j++;
}
// Null terminate the string
integerToKeyLookup[i][j] = '\0';
}
Фактическое преобразование выглядит следующим образом:
std::string integerToKey(unsigned long long input)
{
unsigned long long num = input;
string key = "";
while(num)
{
key += integerToKeyLookup[num % lookupSize];
num /= lookupSize;
}
return key;
}
Это улучшило скорость с большим отрывом, но я все еще верю, что ее можно улучшить. Использование памяти в 32-разрядной системе составляет около 300 МБ, а в 64-разрядной системе - более 400 МБ. Похоже, я должен быть в состоянии уменьшить память и / или улучшить скорость, но я не уверен, как.
Если бы кто-нибудь мог помочь мне понять, как можно оптимизировать эту таблицу, я был бы очень благодарен.