如何在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
相关产品推荐
相关产品推荐

