У меня есть функция Delphi для преобразования в C #. Я нашел примеры C # ELF-32 и, похоже, работает как в Delphi, но у меня есть сомнения с возвращаемым типом ...
Вот функции / процедуры Delphi (результат в дайджесте, Buf - строка для хеширования ...):
Type
TByteArray = array[0..32767] of Byte;
procedure HashELF(var Digest : LongInt; const Buf; BufSize : LongInt);
var
I, X : LongInt;
begin
Digest := 0;
for I := 0 to BufSize - 1 do begin
Digest := (Digest shl 4) + TByteArray(Buf)[I]; {!!.01}
X := Digest and $F0000000;
if (X <> 0) then
Digest := Digest xor (X shr 24);
Digest := Digest and (not X);
end;
end;
procedure StringHashELF(var Digest : LongInt; const Str : string);
begin
HashELF(Digest, Str[1], Length(Str));
end;
function MyHashELF(buffer : string): LongInt;
var
ELFDigest : LongInt;
begin
StringHashELF(ELFDigest, buffer);
result := ELFDigest;
end;
«Возвращаемое значение» имеет тип LONGINT (от –2147483648 до 2147483647)
Я нашел какой-то эквивалент в сети в C #
private static UInt32 MyHashELF(string buffer)
{
UInt32 hash = 0;
for (int i = 0; i < buffer.Length; i++)
{
hash = (hash << 4) + (byte)buffer[i];
UInt32 work = (hash & 0xf0000000);
if (work != 0)
hash ^= (work >> 24);
hash &= ~work;
}
return hash;
}
Но тип возвращаемого значения - Uint32 (от 0 до 4294967295), и если я хочу изменить Uint32 в Int32, я получаю следующую ошибку (для 0xf0000000):
Постоянное значение «4026531840» не может быть преобразовано в «int» (используйте
«непроверенный» синтаксис для переопределения)
Я провел несколько тестов, и на данный момент он работает все время так же, как Delphi, но я думаю, что возможны ошибки из-за разницы типов (нет?). Что мне нужно сделать, чтобы быть на 100% совместимым с кодом Delphi?
P.S. Мне нужно использовать эти 4 байта, возвращенные как есть, как часть строки (своего рода ключи) для дальнейшей обработки ...
Спасибо