anchor.diff:  
   function TRandomHash.MemTransform2(const AChunk: TBytes): TBytes;
   var
  -  i, LChunkLength, LPivot: Int32;
  +  i, LChunkLength, LPivot, LOdd: Int32;
   begin
     LChunkLength := System.Length(AChunk);
     LPivot := LChunkLength SHR 1;
  -  System.SetLength(Result, LChunkLength);
  -  System.Move(AChunk[LPivot], Result[0], LPivot);
  -  System.Move(AChunk[System.Low(AChunk)], Result[LPivot], LPivot);
  +  LOdd := LChunkLength MOD 2;
  +  System.SetLength(Result, LChunkLength);
  +  System.Move(AChunk[LPivot + LOdd], Result[0], LPivot);
  +  System.Move(AChunk[0], Result[LPivot + LOdd], LPivot);
  +  // Set middle-byte for odd-length arrays
  +  if LOdd = 1 then
  +    Result[LPivot] := AChunk[LPivot];
   end;
   
   function TRandomHash.MemTransform3(const AChunk: TBytes): TBytes;
  
positive.code: begin
    LChunkLength := System.Length(AChunk);
    System.SetLength(Result, LChunkLength);
    for i := System.Low(AChunk) to System.High(AChunk) do
      Result[i] := TBits.RotateRight8(AChunk[i], i);
  end;
  
  
negative.code: begin
    LChunkLength := System.Length(AChunk);
    System.SetLength(Result, LChunkLength);
    for i := 0 to High(AChunk) do
      Result[i] := AChunk[LChunkLength - i - 1];
  end;
  
  function TRandomHash.MemTransform4(const AChunk: TBytes): TBytes;
  var
    i, LChunkLength, LPivot, LOdd: Int32;
  begin
    LChunkLength := System.Length(AChunk);
    LPivot := LChunkLength SHR 1;
    LOdd := LChunkLength MOD 2;
    System.SetLength(Result, LChunkLength);
    for i := 0 to System.Pred(LPivot) do
    begin
      Result[(i * 2)] := AChunk[i];
      Result[(i * 2) + 1] := AChunk[i + LPivot + LOdd];
    end;
    // Set final byte for odd-lengths
    if LOdd = 1 THEN
      Result[High(Result)] := AChunk[LPivot];
  end;
  
  function TRandomHash.MemTransform5(const AChunk: TBytes): TBytes;
  var
    i, LChunkLength, LPivot, LOdd: Int32;
  begin
    LChunkLength := System.Length(AChunk);
    LPivot := LChunkLength SHR 1;
    LOdd := LChunkLength MOD 2;
    System.SetLength(Result, LChunkLength);
    for i := System.Low(AChunk) to System.Pred(LPivot) do
    begin
      Result[(i * 2)] := AChunk[i + LPivot + LOdd];
      Result[(i * 2) + 1] := AChunk[i];
    end;
    // Set final byte for odd-lengths
    if LOdd = 1 THEN
      Result[High(Result)] := AChunk[LPivot];
  end;
  
  function TRandomHash.MemTransform6(const AChunk: TBytes): TBytes;
  var
    i, LChunkLength, LPivot, LOffset: Int32;
  begin
    LChunkLength := System.Length(AChunk);
    LPivot := LChunkLength SHR 1;
    LOffset := LChunkLength MOD 2;
    System.SetLength(Result, LChunkLength);
    for i := 0 to System.Pred(LPivot) do
    begin
      Result[i] := AChunk[(i * 2)] xor AChunk[(i * 2) + 1];
      Result[i + LPivot + LOffset] := AChunk[i] xor AChunk[LChunkLength - i - 1];
    end;
    // Set middle-byte for odd-lengths
    if LOffset = 1 THEN
      Result[LPivot] := AChunk[LPivot];
  
  end;
  
  function TRandomHash.MemTransform7(const AChunk: TBytes): TBytes;
  