Flutter哈希计算插件murmur3的使用

Flutter哈希计算插件murmur3的使用

MurmurHash v3 for Dart & Flutter,支持数组和流数据源,在原生和浏览器平台上运行。

示例代码

以下是一个完整的示例demo,展示如何在Flutter应用中使用murmur3插件进行哈希计算。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加murmur3插件:

dependencies:
  flutter:
    sdk: flutter
  murmur3: ^版本号 # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

2. 使用示例

以下是完整的示例代码,展示了如何使用murmur3插件进行哈希计算。

import 'dart:typed_data';
import 'package:murmur3/murmur3.dart';

void main() async {
  print('');
  
  // 计算32位哈希值
  final hash32 = murmur3a('div200').toHex(32);
  print('murmur3a(\'div200\') = 0x$hash32');

  // 计算128位哈希值
  final hash128x64 = murmur3f('div200').toHex(128);
  print('murmur3f(\'div200\') = 0x$hash128x64');

  // 计算流数据的哈希值
  final pkBytes = Stream.fromIterable([0x08, 'div200', 0x00]);
  final pkHash = encodeHash((await murmur3a(pkBytes)).toDouble());
  print('div200 pk hash = ${pkHash.map((b) => b.toHex(8)).join()}');
  print('');
}

// 辅助函数:将哈希值编码为字节数组
final mask64bit = BigInt.parse('0xFFFFFFFFFFFFFFFF');
final max = BigInt.parse('9223372036854775808');

List<int> encodeHash(double value) {
  var buffer = <int>[];
  buffer.add(0x05);
  var num = encodeDoubleAsUInt64(value);
  buffer.add((num >> 0x38).toInt() & 0xFF);
  num = (num << 8) & mask64bit;
  var num2 = 0;
  var flag = true;
  do {
    if (!flag) {
      buffer.add(num2);
    } else {
      flag = false;
    }
    num2 = ((num >> 0x38).toInt() & 0xFF) | 0x01;
    num = (num << 7) & mask64bit;
  } while (num != BigInt.zero);
  buffer.add(num2 & 0xFE);
  return buffer;
}

// 辅助函数:将双精度浮点数编码为无符号64位整数
BigInt encodeDoubleAsUInt64(double value) {
  final dl = Float64List.fromList([value]);
  var bytes = dl.buffer.asUint8List();
  if (Endian.host == Endian.big) {
    bytes = Uint8List.fromList(bytes.reversed.toList());
  }

  var idx = 8;
  var hi = 0;
  while (idx > 4) {
    idx--;
    hi = (hi << 8) | bytes[idx];
  }
  var lo = 0;
  while (idx > 0) {
    idx--;
    lo = (lo << 8) | bytes[idx];
  }

  final num = (BigInt.from(hi) << 32) | BigInt.from(lo);
  return (num >= max) ? (~num + BigInt.one) : (num ^ max);
}

// 扩展方法:将整数转换为十六进制字符串
extension IntHexExt on dynamic {
  String toHex(int bits) => toRadixString(16).padLeft(bits ~/ 4, '0').toUpperCase();
}

3. 运行结果

运行上述代码后,你将在控制台看到类似如下的输出:

murmur3a('div200') = 0xXXXXXXXX
murmur3f('div200') = 0xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
div200 pk hash = XXXXXXXXXXXX

其中XXXXXXXX代表具体的哈希值。

通过这个示例,你可以轻松地在Flutter应用中集成并使用murmur3插件进行哈希计算。


更多关于Flutter哈希计算插件murmur3的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter哈希计算插件murmur3的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,我可以为你提供一个关于如何在Flutter中使用murmur3哈希计算插件的示例代码。murmur3是一种非加密哈希函数,通常用于哈希表等场景。在Flutter中,你可以通过flutter_murmur3这样的插件来使用MurmurHash3算法。

首先,你需要在你的pubspec.yaml文件中添加依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_murmur3: ^x.y.z  # 请替换为实际的版本号

然后运行flutter pub get来获取依赖。

以下是一个使用flutter_murmur3插件的示例代码:

import 'package:flutter/material.dart';
import 'package:flutter_murmur3/flutter_murmur3.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Murmur3 Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _input = 'Hello, Flutter!';
  int? _hashValue;

  void _computeHash() {
    setState(() {
      _hashValue = Murmur3.hash32(_input, seed: 42); // 使用seed 42作为示例
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Murmur3 Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            TextField(
              decoration: InputDecoration(
                labelText: 'Input Text',
              ),
              onChanged: (value) {
                _input = value;
              },
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: _computeHash,
              child: Text('Compute Hash'),
            ),
            SizedBox(height: 16),
            if (_hashValue != null)
              Text(
                'Hash Value: $_hashValue',
                style: TextStyle(fontSize: 18),
              ),
          ],
        ),
      ),
    );
  }
}

在这个示例中:

  1. 我们首先在pubspec.yaml文件中添加了flutter_murmur3依赖。
  2. 然后,我们创建了一个简单的Flutter应用,其中包含一个文本输入字段和一个按钮。
  3. 当用户在文本输入字段中输入文本并点击按钮时,应用会使用Murmur3.hash32方法计算输入文本的哈希值,并显示结果。

注意:

  • Murmur3.hash32方法接受一个字符串和一个可选的seed值。seed值用于初始化哈希计算,不同的seed值会产生不同的哈希结果。
  • 你需要确保在真实环境中替换flutter_murmur3: ^x.y.z为实际的版本号。

希望这个示例对你有帮助!如果你有任何其他问题,欢迎继续提问。

回到顶部