You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flutter(Dart)中实现与JS一致的SHA256十六进制拼接哈希

在Flutter Dart中实现等效的SHA256哈希逻辑

要实现和你提供的JavaScript代码完全一致的功能,需要借助Dart的crypto包处理哈希操作,以下是分步实现:

步骤1:添加依赖

在项目的pubspec.yaml中添加crypto依赖:

dependencies:
  crypto: ^3.0.3

执行flutter pub get完成依赖安装。

步骤2:完整实现代码

import 'dart:convert';
import 'package:crypto/crypto.dart';

void main() {
  const secret = "<SomeSecretHexNumbers>";
  int id = 123456789;

  // 将ID转为十六进制字符串,奇数长度补前导0
  String idHex = id.toRadixString(16);
  if (idHex.length % 2 != 0) {
    idHex = "0$idHex";
  }

  // 将十六进制字符串解码为字节数组(对应JS的Buffer.from(hex, "hex"))
  Uint8List idBytes = hexStringToBytes(idHex);
  Uint8List secretBytes = hexStringToBytes(secret);

  // 拼接字节数组并计算SHA256哈希
  Uint8List combinedBytes = Uint8List.fromList([...idBytes, ...secretBytes]);
  Digest digest = sha256.convert(combinedBytes);

  // 将哈希结果转为十六进制字符串(对应JS的digest("hex"))
  String expectedHash = digest.toString();

  print("Hash: $expectedHash");
}

// 辅助函数:将十六进制字符串转为Uint8List
Uint8List hexStringToBytes(String hex) {
  assert(hex.length % 2 == 0, "Invalid hex string length");
  Uint8List bytes = Uint8List(hex.length ~/ 2);
  for (int i = 0; i < hex.length; i += 2) {
    int byte = int.parse(hex.substring(i, i + 2), radix: 16);
    bytes[i ~/ 2] = byte;
  }
  return bytes;
}

关键逻辑说明

  • ID转十六进制补0:和JS逻辑完全对齐,用toRadixString(16)生成小写十六进制字符串,判断长度奇偶后补前导0。
  • 十六进制转字节:自定义hexStringToBytes函数,实现JS中Buffer.from(hex, "hex")的功能,将每两个十六进制字符转为一个字节。
  • 哈希计算:通过crypto包的sha256.convert处理拼接后的字节数组,digest.toString()直接返回小写十六进制结果,和JS的digest("hex")输出完全一致。

内容的提问来源于stack exchange,提问作者Shiedix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 22:10:17