Существует ли более эффективный способ сделать основание 32 кодирования/декодирования, чем это?


Это путешествие началось с квеста, чтобы создать кратчайшие регистр номер проверки. Исходя из ответов здесь, я работал в классическом ASP/VBScript для выполнения Крокфорд в Base32 кодирования и он служит мне до сих пор.

Из полу-праздное любопытство, мне было интересно, если есть способ, чтобы улучшить производительность. Чтобы было ясно: это работает, и работает более, чем достаточно быстро. Я планирую использовать его более широко, и поскольку я никогда не слышал в лучшую сторону, я надеялся на второй набор глаза, чтобы сказать "Да, это так хорошо, как это собирается сделать" или "вот как можно сделать его более удивительным" или как там.

Так что вам не придется возвращаться к последнему переполнение стека вопрос, чтобы посмотреть код, вот он:

'Base32 encoding functions for shorter, less confusing verification numbers
Const kBase32Digits = "0123456789abcdefghjkmnpqrstvwxyz"

Function ToBase32(ByVal lInput)
    Dim lModulo, sTemp
    Do Until lInput = 0
        lModulo = lInput Mod 32
        sTemp = Mid(kBase32Digits, lModulo + 1, 1) & sTemp
        lInput = lInput \ 32
    Loop
    ToBase32 = sTemp
End Function

Function FromBase32(ByVal sInput)
    Dim sTemp, sR, i,iY,lLen, zMultiplier
    sTemp = LCase(sInput)
    sTemp = Replace(sTemp,"o","0")
    sTemp = Replace(sTemp,"i","1")
    sTemp = Replace(sTemp,"l","1")
    sTemp = Replace(sTemp,"u","v")
    zMultiplier = 1
    lLen = Len(sTemp)
    For i = lLen To 1 Step -1
        sR = Mid(sTemp, i, 1)
        iY = InStr(1, kBase32Digits, sR, vbTextCompare) - 1
        FromBase32 = FromBase32 + iY * zMultiplier
        zMultiplier = zMultiplier * 32
    Next
End Function


Комментарии
2 ответа

Если вы действительно хотите, чтобы преследовать тех миллисекунд, то я бы попробовал следующее:

1) я считаю, что разделение операций как медленно, так что я бы избежать с помощью двух дивизий, если ее можно заменить с одно подразделение, а несколько более легкая деятельность:

Function ToBase32(ByVal lInput)
Dim lModulo, sTemp, lNextInput
Do Until lInput = 0
lNextInput = lInput \ 32
lModulo = lInput - 32 * lNextInput
sTemp = Mid(kBase32Digits, lModulo + 1, 1) & sTemp
lInput = lNextInput
Loop
ToBase32 = sTemp
End Function

2) в каком-то другом языке я бы использовал битный сдвиговый конечно вместо diviosion/умножить. Но насколько я в VBScript нет сдвига операторов.

3) Ваш FromBase32 способ не выглядит оптимальным для меня. Я хотел бы заменить эти заменить и инстр звонки с массив целых чисел для письма символы. Этот массив содержит соответствующего основания 32 номера для чаров. И вы сможете перевести Буквы в числа с помощью индексации массива метод, который намного быстрее, чем искать символ в строке. Некоторые псевдокод, показывающий, как преобразовать символ ср в ряд:

Dim sR;

// defining an array:
Dim charArray = [ 10, // 'a' char
11, // 'b' char
...
17, // 'h'
1 , // 'i' !!
...
0 , // 'o'
...];

Dim lNumber;
if (sR >= 'a' && sR <= 'z')
lNumber = charArray[sR - 'a'];
else // it is digit
lNumber = sR - '0' // in most languages I know this will convert '1' char into 1 integer

P. S. Конечно я ничего не измеряли, я даже не знаю, как VBScript, просто хотел дать вам представление о том, что может быть изменено.

П. П. С.: Мой второй тезис не учитывает, что есть шанс, что в VBScript переводчик будет делать такую оптимизацию для вас.

5
ответ дан 21 апреля 2011 в 09:04 Источник Поделиться

В FromBase32 функции, не использовать vbTextCompare в ваш призыв к инстр. Вы уже LCaseэтой строки, так что вы просто тратите циклов, делая сравнения текстов.

0
ответ дан 13 июля 2011 в 06:07 Источник Поделиться