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.