Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
hash 14.12.01 13:02 Число просмотров: 3356
Автор: iddqd <Юрий> Статус: Member
|
> всё значительно проще.. > если тебе надо поменять хешируемый блок и получить > определённое значение хеша, тогда вот: > > int hash(int *b) > { int x,y,i=0; > x=b[0]; > do{y=b[++i]; x=fu(x,y);}while(i!=0x100); > return x; > } > > если поменять b[a] на b`[a], то поменяется x начиная с i-ой > итерации, соответственно надо найти такое у, что fu( > b`[a], y ) = fu( b[a], b[a+1] ) и поставить его вместо > b[a+1].. > получается уравнение: > дано - x и fu( x, y ) > найти - y > > int fu(int x1,int x2) > { int a,b,c,d,i,j=0; > do{ a=0; > b=x1&0x80000057; > for(i=0;i<0x20;i++) {if(b&1)a++; > b>>=1;} > // > x1=(x1>>1)&0x7fffffff; > // не совсем понятно зачем нужно &0x7ffff > if(a&1)x1|=0x80000000; > /* а вообще очень смахивает на регистр сдвига с полиномом > обратной связи 0x80000057 и начальным заполнением x1
я тормоз %) это же он и есть (регистр сдвига)!!
до какого-то времени считался достаточно стойким алгоритмом
в принципе это уже можно считать ответом, если не учитывать 0x80000057 (непонятно какой у него период)
> однако это не важно
не, помоему это важно, изначально вопрос ставился о стойкости алгоритма
> */ a=0; c=x2&x1; > for(i=0;i<0x20;i++) {if(c&1)a++; > c>>=1;} > // а вот здесь a&1 - это скалярное произведение x2 и x1
если я правильно понял, это умножение на строку матрицы, или я опять что-то перепутал?
> d=(d<<1)a&1); > }while(++j!=0x20); > return d; > } > > что из этого следует: > > d(32-i) = <x2, x1(i+1)>, для i=0..31. > d(i) - i-й бит из d; > <.,.> - скалярное произведение; > x1(i) - регистр сдвига сдвинутый i раз. > > получается 32 уравнения и 32 неизвестных.. > > решается очень просто: > пишем матричное уравнение > > (D) = (X2)(X1) > d - строка из 32-х элементов > x2 - столбец > x1 - матрица 32х32, в которой i-я строка равна x1(i+1) > > решаем матричное уранение: > (X2) = (D)(X1`), где X1` - матрица обратная к X1.. > вот и всё.. > > P.S. глядя на исходник подумалось: "а зачем вообще люди > пробелы придумали?" да там, видимо, тег "pre" забыли поставить ;)
>
а вообще, классный ответ!!!! ;)
|
- hash - nimrod 13.12.01 13:29 [2500]
- hash - iddqd 13.12.01 15:06 [3477]
- hash - nimrod 13.12.01 16:59 [3219]
- hash - iddqd 13.12.01 17:24 [3437]
- hash - nimrod 13.12.01 17:42 [3097]
- hash - iddqd 13.12.01 17:59 [3177]
- hash - nimrod 13.12.01 18:09 [3088]
- hash - iddqd 13.12.01 18:33 [3042]
- hash - zelych 14.12.01 12:34 [3310]
|
|
|