Мне нужна функция, которая удовлетворяла бы следующим условиям: 1) Функция должна быть односторонней (необратимой), по результату нельзя восстановить входное значение; 2) На вход подаются значения от 0 до 0FFFFFFFFh(DWORD); 3) Коллизий на етом отрезке быть не должно; 4) Чем меньше функция занимает байт тем лучше =); Памагите чем сможете =).
дык возьми CRC32 или MD5 - на этом сайте есть. Тока придется малость переделать. Но это уже совсем мелочь.
А что мешает взять сначала MD5, а после все 16 байтов любыми математич. и/или логич. дествиями привести к DWORD ? Или ты имел ввиду код самой реализации MD5 ?
Если входной алфавит всего 2^32 то о каком свойстве необратимости (п.1) можно говорить ? Входное значение полным перебором будет найдено на любом Pentium-166. По-моему, вы не понимаете то, что хотите. Может опишете предметную область ?
jeni, MD5 можно не писать, если кодешь под винду, он уже есть в винде реализованный, тока кидаешь данные, получаешь хеш
Code (Text): GetCRC32 proc lpData, dwDataSize:DWORD pushad xor eax,eax mov edx,lpData mov ecx,dwDataSize cmp ecx,eax jnz calc_crc32 mov edi,edx @@: scasb jnz @B dec edi mov ecx,edi sub ecx,edx calc_crc32: not eax @1: xor al,[edx] inc edx mov bl,8 @2: shr eax,1 jnc @3 xor eax,0EDB88320h @3: dec bl jnz @2 loop @1 not eax mov [esp+7*4],eax popad ret GetCRC32 endp но его можно сократить - тут он сам может вычислять длину строки, если dwDataSize=0. Если это убрать, будем совсем маленький