- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试从http://isthe.com/chongo/tech/comp/fnv/实现FNV哈希
我在该页面上将PowerBasic的嵌入式asm转换为Delphi。
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 <> 0 then
dSize := GetFileSize(hFile, nil);
if dSize <> 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//&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;
最佳答案
您的asm代码有些错误,恕我直言。编写时,它会使应用程序崩溃。
您需要预先设置esi / edi / ebx寄存器
参数在eax,ecx,edx寄存器中传递
结果是eax寄存器
正确的方法可以进行测试(未经测试,仅在此处编写):
function fnv32(dwOffset : Pointer; dwLen : DWORD; offset_basis: DWORD) : DWORD ;
asm // eax=dwOffset ecx=dwLen edx=offset_basis -> result in eax
push esi
push edi
mov esi,eax
mov eax,edx
or ecx,ecx
je @z
mov edi,16777619
xor edx,edx
@1:
mul edi
mov dl,[esi]
xor eax,edx
inc esi
dec ecx
jnz @1
@z:
pop edi
pop esi
end;
function fnv32file(const aFileName: TFileName): DWORD;
begin
with TMemoryStream.Create do
try
LoadFromFile(aFileName);
result := fnv32(Memory,Size,0);
finally
Free;
end;
end;
function fnv32(dwOffset : PByteArray; dwLen : DWORD; offset_basis: DWORD): DWORD ;
var i: integer;
begin
result := offset_basis;
for i := 0 to dwLen-1 do
result := (result*16777619) xor DWORD(dwOffset^[i]);
end;
关于delphi - FNV的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4191523/
我正在尝试快速实现 FNV 散列的一个版本。这是在 Objective-C 中: + (uint32_t)hash:(uint8_t *)a length:(uint32_t)length {
这是算法的内容。 hash = FNV_offset_basis for each octet_of_data to be hashed hash = hash * FNV_prime
我正在尝试整合 FNV基于 PHP 的项目的哈希算法,作为为各种数据(例如 URL、关键字)生成哈希的要求的一部分。 我看到了这个implementation内文博亚诺夫。他提到由于 PHP 的算术限
如果在计算FNV-1a的过程中有什么不利影响吗?哈希,一次异或 4 个字节而不是一个字节? 最佳答案 是的,有问题。该算法对每个字节进行异或运算,然后乘以将该字节与其余值“混合”。如果您一次对四个字节
我的 iPhone 项目中有一个 HTTP 连接器,查询必须使用 Fowler–Noll–Vo (FNV) 哈希根据用户名设置参数。 此时我有一个 Java 实现,这是代码: long fnv_pri
我有一列存储 uuid 字符串。我添加一个新列来存储其整数(64 位)哈希值以进行索引。选择哪个哈希函数? 1. int(md5('a306d9cb-4d75-4673-ae43-7004706925
我是一名优秀的程序员,十分优秀!