xxh3 (for Dart)
Port of the XXH3 hashing algorithm in Dart.
Presently, only the 64-bit version of XXH3 (XXH3-64) is supported. Please feel free to open a GitHub issue if you need support for XXH3-128.
import 'dart:convert' show utf8;
import 'dart:typed_data';
import 'package:xxh3/xxh3.dart';
void main() {
// Get the string as UTF-8 bytes.
final helloWorldBytes = utf8.encode("Hello, world!");
// Use XXH3 to hash the byte array (returns an int).
// XXH3 is a 64-bit hash, so the value is returned in the
// form of a 64-bit integer.
final int digest = xxh3(helloWorldBytes);
print(digest); // -881777603154417559
// Alternatively, in version 1.1.0+, you can use the
// xxh3String convenience method to get a hexadecimal
// string representation of the hash.
final String hexDigest = xxh3String(helloWorldBytes);
print(hexDigest); // f3c34bf11915e869
// Similarly, in version 1.2.0+, you can use the
// stream API to process your data in blocks.
final hashStream = xxh3Stream();
hashStream.update(helloWorldBytes);
print(hashStream.digest()); // -881777603154417559
print(hashStream.digestString()); // f3c34bf11915e869
// See the examples and documentation for more...
}
Refer to the Example tab for a 'quick start guide', or for more details refer to the API Documentation.
Performance
As it stands, this is a port written entirely in Dart. At the time of writing it has a throughput of ~0.29 ns/byte (3.16 GB/s) on an Apple M-series processor in JIT mode or ~0.28 ns/byte (3.23 GB/s) in AOT mode.
The streaming APIs currently have no further optimization and are therefore about 0.4-0.6ns/byte slower than the buffered APIs.
You can run the benchmarks yourself on your machine with the following commands:
# For JIT mode
dart run tool/benchmark.dart
# For AOT mode
dart compile exe tool/benchmark.dart -o benchmark
./benchmark
If better performance is needed, dart:ffi
can be used to call the original
C implementation. This is not currently implemented in this package, but feel
free to open a ticket on GitHub if you would like this.
This assumes that the int
type is a 64-bit integer, so this will likely not
provide correct results for Dart web (JavaScript), where after 2^53, integers
become floating point numbers. If there is demand for this, that could probably
be addressed by using a custom integer type or a JavaScript Uint8Array
.
WebAssembly could also be a potential workaround, but I have not investigated this yet.
Libraries
- xxh3
- A Dart port of the XXH3 hashing function.