Note that there are some explanatory texts on larger screens.

plurals
  1. POImplementation of FNV
    primarykey
    data
    text
    <p>I am trying to implement FNV hash from <a href="http://isthe.com/chongo/tech/comp/fnv/" rel="nofollow">http://isthe.com/chongo/tech/comp/fnv/</a></p> <p>I converted the PowerBasic's inline asm on that page into Delphi.</p> <pre><code> function ReadFileToMem(sPath:string):Pointer; var hFile: THandle; pBuffer: Pointer; dSize: DWORD; dRead: DWORD; begin hFile := CreateFile(PChar(sPath), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0); if hFile &lt;&gt; 0 then dSize := GetFileSize(hFile, nil); if dSize &lt;&gt; 0 then begin SetFilePointer(hFile, 0, nil, FILE_BEGIN); GetMem(Result, dSize); ReadFile(hFile, Result^, dSize, dRead, nil); if dRead = 0 then MessageBox(0, PChar('Error reading file.'), PChar('Read Error'), MB_ICONEXCLAMATION) end; CloseHandle(hFile); end; function GetPointerSize(lpBuffer: Pointer): Cardinal; // Function by ErazerZ begin if lpBuffer = nil then Result := Cardinal(-1) else Result := Cardinal(Pointer(Cardinal(lpBuffer) -4)^) and $7FFFFFFC -4; end; FUNCTION FNV32( dwOffset : Pointer; dwLen : DWORD; offset_basis : DWORD) : DWORD ; asm mov esi, dwOffset //;esi = ptr to buffer mov ecx, dwLen //;ecx = length of buffer (counter) mov eax, offset_basis //;set to 2166136261 for FNV-1 mov edi, 16777619//&amp;h01000193 //;FNV_32_PRIME = 16777619 xor ebx, ebx //;ebx = 0 @nextbyte: mul edi //;eax = eax * FNV_32_PRIME mov bl, [esi] //;bl = byte from esi xor eax, ebx //;al = al xor bl inc esi //;esi = esi + 1 (buffer pos) dec ecx //;ecx = ecx - 1 (counter) jnz @nextbyte //;if ecx is 0, jmp to NextByte mov @result, eax //;else, function = eax end; procedure TForm1.Button1Click(Sender: TObject); var pFile : Pointer; hFile : Cardinal; begin //Profiler1['Test'].Start; pFile := ReadFileToMem(fn); hFile := FNV32(pFile,GetPointerSize(pFile),2166136261); //Profiler1['Test'].Stop; //OutputDebugString(pchar(Profiler1['Test'].AsText[tiAll])); OutputDebugString(pchar(inttostr(hFile))); end; </code></pre> <p>If a size of given file is more that 200KB, the output is random (hash) number. Am I missing something?</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload