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

PHP实现ProvablyFair算法时如何提取HMAC_SHA256前四字节为整数?

解决方法

首先你当前的实现存在一个误区:hash_hmac默认返回的是十六进制编码的字符串,每2个字符对应1个原始字节,直接截取前4个字符只能拿到2个字节的有效数据,无法满足提取4个字节的需求。

你可以按照以下步骤实现:

  1. 调用hash_hmac时开启二进制输出:将第四个参数设为true,直接获取原始二进制哈希值,避免十六进制转码的额外处理
  2. 截取前4个字节的二进制片段
  3. 用unpack函数直接将二进制片段解析为无符号字符数组

完整实现代码

<?php
$ServerSeed = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
$ClientSeed = "3333";
$Nonce = "10";
$Row_number = "1";
$Data = "{$ClientSeed}:{$Nonce}:{$Row_number}:0";

// 第四个参数传true获取原始二进制哈希值
$randomBinary = hash_hmac('sha256', $ServerSeed, $Data, true);
// 截取前4个字节
$first4Bytes = substr($randomBinary, 0, 4);
// 解析为无符号字符数组,C代表无符号char,*代表解析所有输入
$byteArray = array_values(unpack('C*', $first4Bytes));

// 输出结果就是你需要的[xx, xx, xx, xx]格式数组
print_r($byteArray);

代码说明

  • unpack('C*', $first4Bytes)会把输入的二进制串逐个字节转换为0-255的整数,返回的数组默认下标从1开始,用array_values可以直接转为从0开始的索引数组
  • 如果不想用二进制输出,也可以处理默认返回的十六进制串:先截取前8个十六进制字符(对应4个字节),再每2个一组转十进制,不过性能和可读性都不如直接处理二进制的方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:51:02