Checking your logbook's checksum

How the records checksum on every logbook export shows that the records were not changed afterwards.

Business accounts

Every logbook export carries a records checksum: a 64-character code calculated from the records themselves. The PDF prints it at the foot of every page, the CSV repeats it in its last column, and the XLSX states it on its archive sheet ("Archive note" in English, "Archivace" in Czech). For the same cars, period, filter and language, all three show the same code.

The export is written in your country's language unless your account owner chose another in Settings, Exports & Reports. The column headers and the words "business" and "private" are part of the records, so the Czech and the English export of the same trips have different codes. Each one matches its own file.

What it proves

If anyone changes a single record after the export -- a date, a place, a distance, a purpose -- the records no longer produce the same code. So a code that still matches shows that the records are exactly as Viametry exported them. Changes made inside Viametry before the export are not hidden by this: they are listed in the change history of each export.

What it covers

The logbook columns of every row, from Date to Allowance rate (the first eighteen columns, whatever their names in your language), with the header row. Not the last five columns -- the change count, the change history, the trip-grouping changes, the archive note and the checksum itself: they describe the records rather than being them.

How to recompute it

You need the CSV export and Python 3 (installed on most Macs and Linux computers). Save this as check.py next to the CSV and run it with the file's name, for example python3 check.py viametry-kniha-jizd-2026-09-30.csv (the name is in the export's language; viametry-logbook-... in English):

import csv, hashlib, io, sys

with open(sys.argv[1], encoding="utf-8", newline="") as f:
    rows = list(csv.reader(f))
end = len(rows[0]) - 5  # the last five columns describe the records
out = io.StringIO()
csv.writer(out, lineterminator="\r\n").writerows(row[:end] for row in rows)
print("calculated:", hashlib.sha256(out.getvalue().encode("utf-8")).hexdigest())
print("in the file:", rows[1][-1])

The same script works for every language. A file without any drive has no row to carry the code, so there is nothing to compare.

The two lines match when the records are unchanged. Open the CSV in a text editor, not a spreadsheet program, if you want to look at it first: saving it from a spreadsheet can change the format of numbers and dates, and with them the checksum.

The exact definition

For people who want to check it with other tools: SHA-256 over the logbook columns (the first eighteen, Date to Allowance rate) of the CSV, header first, one line per row, a value in double quotes only when it contains a comma, a double quote or a line break (a double quote inside is doubled), every line ending in CR LF, encoded as UTF-8 without a byte-order mark. Dates and numbers in the CSV are always written the same way (2026-03-10, 12.5), whatever the language.

Did not find your answer? Write to support@viametry.com. In the app, Help at the top right of every page opens the guide for that page.

← All help articles