Суббота, 23.11.2024, 13:52
Приветствую Вас Гость

Каталог статей

Главная » Статьи » S3DecoderLib

S3DecoderLib: Приложение 3. FNV хэш-функции

Приложение 3: FNV хэш-функции

 

[ Стабильный билд • Вспомогательные типы данных и функции • Sims3: FNV (eng) • Википедия: FNV • Википедия: Хеширование ]

 

Програмный модуль и версия

DBPF2Utils.pas, rev.120825

 

Краткий обзор

 

FNV (англ. Fowler–Noll–Vo) – семейство простых некриптографических хэш-функций общего применения, в The Sims 3 FNV-функции используются в различных ресурсах игры в виде 32-разрядной или 64-разрядной форм для генерации идентификаторов свойств, экземпляров записей, костей и т.п. Изредка используется 24-разрядый хэш, который вычисляется как 32-разрядый хэш, а затем старший байт отбрасывается, а младший складывается по "исключающему или" (xor) со старшим

 

Описание алгоритма

 

Реализация функции хэширования проста, ее реализация – берется некое начальное число, а затем последовательно для каждого байта данных умножается на простое число и складывается (xor-ится) с ними по модулю 2.

Когда хэшируются строки, их символы вначале конвертируются в нижний регистр (в прописные), в связи с этим связана невозможность использования кириллицы в них.

 

FNV.jpg

 

Примеры реализации алгоритмов FNV хэширования для строк и массивов байт:

function FNV64(s: string): UInt64;
// вычисляет FNV64 для ASCII строки
const
  mul: UInt64 = $00000100000001B3;
var
  i, l: integer;
  b: byte;
begin
  result:= $CBF29CE484222325;
  s:= LowerCase(s);
  l:= Length(s);
  for i:= 1 to l do begin
    b:= ord(s[i]);
    result:= (result*mul) xor b;
  end
end;
function FNV32(a: TBytes; ABegin: integer; AEnd: integer): DWORD;
// вычисляет FNV32 для массива байт
const
  mul: DWORD = $01000193;
var
  i: integer;
begin
  result:= $811C9DC5;
  if AEnd=0 then AEnd:= High(a);
  for i:= ABegin to AEnd do
    result:= (result*mul) xor a[i];
end;
Категория: S3DecoderLib | Добавил: crazylab (27.09.2013)
Просмотров: 861