(*
    Greenfish Icon Editor Pro
    Copyright (c) 2012-13 B. Szalkai

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*)
// Fowler-Noll-Vo (FNV1a) hashing
unit fnvHash;

interface

type
  TfnvKey = UInt64;

var
  fnvNull: TfnvKey = 14695981039346656037;

// Appends Data to an existing hash value
// e.g. fnvAppend(fnvNull, @s[1], Length(s)) returns the hash of s
function fnvAppend(Hash: TfnvKey; Data: PByte; Size: integer): TfnvKey;

implementation

function fnvAppend;
const
  fnvPrime = 1099511628211;

var
  i: integer;

begin
  Result := Hash;
  for i := 1 to Size do
  begin
    Result := (Result xor Data^) * fnvPrime;
    inc(Data);
  end;
end;

end.

