Пользовательский алгоритм контрольной суммы


Некоторое время назад, я воссоздал контрольная сумма алгоритм из ММО , используемое для проверки действительности предмет, который связан с чата (аналог ВОВ). Идея заключается в том, что если контрольная сумма является недействительной, то клиент игры будет игнорировать связь при нажатии. В противном случае при нажатии на ссылку элемента в чат в игре будет отображать стат и свойства для этого элемента.

ushort16 CreateChecksum(const string &itemlink)
{
    stringstream parseitemlink(itemlink);
    uint32 hexform[ITEMLINKGROUPCOUNT] = {0};
    uint32 hexsum = 0;

    //Parse itemLink string into hexform array
    for (int i = 0; i < ITEMLINKGROUPCOUNT; ++i)
        parseitemlink >> hex >> hexform[i];

    //sum all the itemlink group together
    for (int i = 0; i < ITEMLINKGROUPCOUNT; ++i)
        hexsum += hexform[i];

    for (int i = 0; i < ITEMLINKGROUPCOUNT; ++i)
    {
        uint32 ebx = hexform[i], edi = ebx * i;

        //if loop iteration is odd store MSB 2-bytes.
        //Otherwise, store working hexgroup as is untouched
        if (i & 0x01)
            ebx = hexform[i] >> 16; // aka same as dividing hexform[i] by 65,536

        // (hexform[i] / 65,536) + (hexform[i] * i) + hexsum -- for odd groups
        //  hexform[i] + (hexform[i] * i) + hexsum           -- for even groups
        ebx += edi + hexsum;
        hexsum = ebx ^ hexform[i];
    }

    for (int i = 0; i < ITEMLINKGROUPCOUNT; ++i)
    {
        // the more familiar high-level form would be
        // hexform[i]^2 + hexform[i] * hexsum
        uint32 ecx = (hexform[i] + 1) * hexsum,
               eax = ecx * hexform[i];

        eax >>= 16;
        eax += ecx;
        hexsum = eax ^ hexform[i];
    }

    //return the lower 2-bytes of hexsum
    //as the final checksum
    return hexsum & 0xFFFF;
}//CreateChecksum

Формат itemlink состоит из группы шестнадцатеричных через пробел в строке формата. Она прошла в основной() в качестве аргумента при запуске программы.

Вот пример itemlinkшестигранной строка может выглядеть так:

const string EXAMPLELINK = "36c6a 0 3f000a54 d0f1 0 0 0 0 0 0 20d0";

Есть ли код пахнет или вопросы читабельности в этом сегменте кода? Может какую-то часть(ы) его улучшить?



2354
18
задан 19 января 2011 в 10:01 Источник Поделиться
Комментарии
2 ответа

Если вы используете стандартную библиотеку классов с одинаковыми именами, я бы дал следующие имена правильное пространство имен классификатор: СТД::строка, с std::stringstream, СТД::наговор.

В C++ это работает так же хорошо, ИМХО это Милды более идиоматические.

uint32 hexform[ITEMLINKGROUPCOUNT] = {};

регистры ebx, EDI, в, Екб, еах не хорошие имена переменных, если вы можете дать им более осмысленные имена, а потом делать.

    uint32 ecx = (hexform[i] + 1) * hexsum,
eax = ecx * hexform[i];

Лично я думаю, что это яснее:

    uint32 ecx = (hexform[i] + 1) * hexsum;
uint32 eax = ecx * hexform[i];

Комментарий это очень плохо, потому что она рассказывает о hexform[я]^2 + hexform[я] * hexsum а Екб получает значение hexform[я] * hexsum + hexsum и еах возвращает значение hexform[я]^2 * hexsum + hexform[я] * hexsum. Я думаю, что комментарий должен пару круглых скобок, если код делает то, что вы имели в виду.

Чтобы быть эффективным, вы должны проверить, является ли парсить работал.

parseitemlink >> hex >> hexform[i];

Вы можете легко объединить первые два для петель, а также.

9
ответ дан 19 января 2011 в 10:01 Источник Поделиться

Единственное, что я могу видеть проблемы ваши аббревиатура имен переменных, т. е. (еах, регистр ecx, ebx, а Эди) не объяснить, что такое переменные явно хранить для кого-то не сталкивалась с делаю контрольные суммы.

Другая вещь, которую я вижу на вопросы читаемость вашей строчными буквами имен переменных, которые являются описательными (т. е. parseitemlink) должен быть в формате, поэтому я могу говорить разные слова (т. е. parseItemLink). Это единственное, что я могу думать о читабельности мудрый.

4
ответ дан 19 января 2011 в 10:01 Источник Поделиться