在PHP中计算散列在本地和测试环境中产生不同的结果
Computing hash in PHP yields different results on local and test environments.
我试图在服务器端验证客户端生成的散列。
我的客户端js代码看起来像这样:
_hash: function(value) {
var hash = 5381;
for (var i = 0; i < value.length; i++) {
hash = ((hash << 5) + hash) + value.charCodeAt(i);
}
return hash;
}
和服务器端PHP代码如下:
$hash = 5381;
$value = strtoupper($input);
for($i = 0; $i < strlen($value); $i++) {
$hash = (($hash << 5) + $hash) + ord(substr($value, $i));
}
当应用到字符串"FMQXXU"时,你应该在两边得到-1329107890。
两个脚本在我的本地环境下都可以完美地工作,但是当我在不同的机器上进行测试时,只有js代码可以工作。php代码返回6952222944334。
本地php是5.3.8版本测试PHP为5.3.3版本
为什么我得到不同的结果?
您可以使用这个函数将64位转换为32位:
function to_32bits($val) {
$sign = 1 << 31;
return $val & ($sign) ? -(~($val & 0x7fffffff) + 1 + ($sign)) : $val & 0xffffffff;
}
示例:
$a = -1329107890;
$b = 6952222944334;
function to_32bits($val) {
$sign = 1 << 31;
return $val & $sign ? -(~($val & 0x7fffffff) + 1 + $sign) : $val & 0xffffffff;
}
echo $a . ' ' . to_32bits($b);
将输出:-1329107890 -1329107890
我不确定是否有更好的方法来进行转换
相关文章:
- JSPerf 测试结果随着测试的运行而变慢
- 在浏览器上显示实习运行程序功能测试的结果
- 在量角器中验证测试结果(非“预期”功能)
- 基准测试js的结果是什么意思
- 在使用Protractor进行测试时,我可以用json文件替换结果,而不是调用实际的REST端点
- 如何从批处理文件调用一个带有2个参数的java脚本函数,并将结果返回到环境变量
- 如何修复SQL Inject-Me测试结果
- 使用 JSDom 在节点测试环境中正确接近“窗口”
- 对 URL 使用 E2E 量角器测试 HTTP 结果
- Jasmine 测试在测试运行中、Firefox/Chrome 之间以及检查器开/关时的结果不一致
- 使用 Mocha 在 NodeJS 和 MongoDB 中测试用户模型时没有结果
- Javascript未在Rails测试环境中加载
- 为什么我的程序在我的测试环境中工作,而不是我的实时站点
- 如何为 AngularJS 设置自动化测试环境
- 为什么我的 javascript 在测试环境中工作,但在实时站点上不起作用
- 使用Javascript在实时网站上创建一个测试环境
- 为什么我的javascript在现场停止工作,但在测试环境中工作得很好
- 如何在测试环境中的测试中设置CasperJS页面选项
- 如何在经典ASP中分离活动环境和测试环境?(请在取消标记jQuery/JS之前阅读)
- 在PHP中计算散列在本地和测试环境中产生不同的结果