file_hasher

A utility for hashing one or more files with the XXH3 hashing algorithm.

file_hasher relies on the xxh3 package.

About

file_hasher works by splitting files into chunks, individually hashing each chunk with the XXH3 hashing algorithm, then combining each hash with the existing digest with the bit-wise exclusive-or operator (^), and returning the result.

The FileHasher utility class provides a method to hash individual files, hash, as well as a method to hash multiple files, smash, and their synchronous variants, hashSync and smashSync.

Usage

import 'package:file_hasher/file_hasher.dart';

hash & hashSync

The hash and hashSync methods hash the contents of a single file.

hash streams the contents of a file, while hashSync reads the file synchronously then processes the file data.

final file = File.fromUri(Uri.file('path/to/file'));

// Asynchronously hash the file.
print(await FileHasher.hash(file));

// Synchronously hash the file.
print(FileHasher.hashSync(file));

smash & smashSync

The smash and smashSync methods hash the contents of multiple files in the order they're listed.

smash streams the contents of the files, while smashSync reads the files synchronously then processes the file data.

final files = <File>[
  File.fromUri(Uri.file('path/to/file1')),
  File.fromUri(Uri.file('path/to/file2')),
  File.fromUri(Uri.file('path/to/file3')),
];

// Asynchronously hash the files.
print(await FileHasher.smash(files));

// Synchronously hash the files.
print(FileHasher.smashSync(files));

File extension methods

file_hasher extends the File object from the dart:io package with two methods: xxh3 and xxh3Sync; which call FileHasher's hash and hashSync methods respectively.

// Asynchronously hash the file.
print(await file.xxh3());

// Synchronously hash the files.
print(file.xxh3Sync());

Parameters

Each of the methods provided by FileHasher, as well as the File extension methods, have 3 optional parameters: chunkSize, seed, and secret.

See below for details.

final hash = await FileHasher.hash(
  file,
  chunkSize: 500,
  seed: 20220713,
  secret: mySecretUint8List,
);

chunkSize

chunkSize sets the number of bytes to include in each chunk of data being hashed; changing the chunkSize will result in different hashes being returned for any files containing more bytes than the chunkSize.

chunkSize defaults to 2500.

seed

A seed can be provided as an int to randomize the hash function.

seed defaults to 0.

secret

An optional secret can also be provided as a Uint8List to randomize the hash function.

If provided, the secret must be at least 136 bytes.

Note: Per XXH3 and the xxh3 package, the secret must look like a bunch of random bytes as the quality of the secret impacts the dispersion of the hash algorithm. "Trivial" or structured data such as repeated sequences or a text document should be avoided.

Note: Uint8List can be imported from the dart:typed_data package and can be constructed from a list of ints.

Libraries

file_hasher
A utility for hashing one or more files with the XXH3 hashing algorithm.