FLUTTER ECOSYSTEM

SamJakob/xxh3

xxHash からの XXH3 ハッシュアルゴリズムの Dart 実装(ポート)。

xxh3 のプロジェクト画像
Stars
11
Forks
7
最終プッシュ(UTC)
2024/12/06
プロジェクト状態
公開中
SamJakob GitHub avatar
GITHUB User

SamJakob ↗

Software Engineer & Full Stack Developer

@apollosoftwarexyz公式サイト ↗
言語DartShell

このリポジトリが公開するパッケージ

使用している依存関係

依存関係一覧 2 件

元の README

以下は英語原文のスナップショットです。最新版は GitHub をご覧ください。

README を開く / 閉じる

xxh3 (for Dart)

Pub Publisher Pub Version GitHub Workflow Status Codecov MIT License

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.