file_hasher

一个使用 XXH3 哈希算法对一个或多个文件进行哈希处理的实用工具。

file_hasher 依赖于 xxh3 包。

关于

file_hasher 通过将文件分割成块,使用 XXH3 哈希算法单独哈希每个块,然后将每个哈希值与现有摘要进行按位异或运算 (^) 并返回结果来工作。

[FileHasher] 实用类提供了一个用于哈希单个文件的 [hash] 方法,以及一个用于哈希多个文件的 [smash] 方法,以及它们的同步版本 [hashSync][smashSync]

用法

import 'package:file_hasher/file_hasher.dart';

hash & hashSync

[hash][hashSync] 方法对单个文件的内容进行哈希处理。

[hash] 流式处理文件内容,而 [hashSync] 同步读取文件然后处理文件数据。

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

[smash][smashSync] 方法按照列出的顺序对多个文件的内容进行哈希处理。

[smash] 流式处理文件内容,而 [smashSync] 同步读取文件然后处理文件数据。

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_hasher 使用两个方法扩展了 dart:io 包中的 [File] 对象:[xxh3][xxh3Sync];它们分别调用 [FileHasher][hash][hashSync] 方法。

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

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

参数

[FileHasher] 提供的每个方法以及 [File] 扩展方法都有 3 个可选参数:[chunkSize][seed][secret]

有关详细信息,请参见下文。

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

chunkSize

[chunkSize] 设置了哈希处理的每个数据块包含的字节数;更改 [chunkSize] 将导致任何字节数超过 [chunkSize] 的文件的哈希值发生变化。

[chunkSize] 默认为 2500

seed

可以提供一个 [int] 类型的 [seed] 来随机化哈希函数。

[seed] 默认为 0

secret

还可以提供一个可选的 [secret],类型为 [Uint8List],用于随机化哈希函数。

如果提供了 [secret],它必须至少有 136 字节。

注意: 根据 XXH3xxh3 包,secret 必须看起来像一堆随机字节,因为 secret 的质量会影响哈希算法的分散性。应避免使用“平凡”或结构化数据,例如重复序列或文本文档。

注意: [Uint8List] 可以从 dart:typed_data 包导入,并可以从 [int] 列表构造。

GitHub

查看 Github