PHP实现ProvablyFair算法时如何提取HMAC_SHA256前四字节为整数?
解决方法
首先你当前的实现存在一个误区:hash_hmac默认返回的是十六进制编码的字符串,每2个字符对应1个原始字节,直接截取前4个字符只能拿到2个字节的有效数据,无法满足提取4个字节的需求。
你可以按照以下步骤实现:
- 调用
hash_hmac时开启二进制输出:将第四个参数设为true,直接获取原始二进制哈希值,避免十六进制转码的额外处理 - 截取前4个字节的二进制片段
- 用
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
相关产品推荐
相关产品推荐

