adler32
От: Крыс http://erasers.pp.ru/
Дата: 19.01.06 09:35
Оценка:
Смотрю я на исходники алгортима adler32:
uLong ZEXPORT adler32(adler, buf, len)
    uLong adler;
    const Bytef *buf;
    uInt len;
{
    unsigned long s1 = adler & 0xffff;
    unsigned long s2 = (adler >> 16) & 0xffff;
    int k;

    if (buf == Z_NULL) return 1L;

    while (len > 0) {
        k = len < NMAX ? len : NMAX;
        len -= k;
        while (k >= 16) {
            DO16(buf);
        buf += 16;
            k -= 16;
        }
        if (k != 0) do {
            s1 += *buf++;
        s2 += s1;
        } while (--k);
        s1 %= BASE;
        s2 %= BASE;
    }
    return (s2 << 16) | s1;
}
И не понятен мне один момент, зачем в функцию помимо хэшируемой последовательности байт и её длины передаётся ещё и некое инициализирующее значение adler???
Re: adler32
От: Кодт Россия  
Дата: 19.01.06 09:49
Оценка: 1 (1) +1
Здравствуйте, Крыс, Вы писали:

К>Смотрю я на исходники алгортима adler32:

К>И не понятен мне один момент, зачем в функцию помимо хэшируемой последовательности байт и её длины передаётся ещё и некое инициализирующее значение adler???

Не стал вчитываться в код. Но подозреваю, — для того, чтобы можно было выполнять последовательность хеширований.

Если выполняется дистрибутивный закон
h(h0,s1+s2) = h(h(h0,s1),s2)

То, разбив входную цепочку s на множество фрагментов (например, не храня её в памяти целиком, а считывая кусочками из файла), получим
h0 = 0 // или там FFFF, или я не знаю что
пока не конец файла
  str = очередная порция
  h0 = h(h0, str)
хеш_всего_файла = h0
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.