对于Web应用程序,我需要PHP中的RSHash函数(RSHash => Robert Sedgewick的字符串散列算法)。如何为PHP创建RSHash函数
我确实在VB6中有一个实现,我现在必须在PHP中重建这个函数。我所拥有的是以下VB6码:
Private Function RSHash(ByVal Str As String) As Double
Dim b As Long
Dim a As Variant
Dim hash As Variant
Dim i As Long
b = 378551
a = 63689
For i = 1 To Len(Str)
hash = MultiLong(hash, a) + Asc(Mid(Str, i, 1))
a = MultiLong(a, b)
Next i
RSHash = hash
End Function
Private Function MultiLong(a As Variant, b As Variant) As Variant
Dim vDec As Variant
vDec = CDec(a)
vDec = CDec(a) * CDec(b)
vDec = vDec - CDec(Fix(vDec/(2^32))) * CDec((2^32))
MultiLong = vDec
End Function
我在PHP做了:
function RSHash($string) {
$a = 63689;
$b = 378551;
$hash = 0;
for ($i = 0, $x = strlen($string); $i < $x; $i++) {
$hash = multiLong($hash, $a) + (int) ord($string[$i]);
$a = multiLong($a, $b);
}
return $hash;
}
function multiLong($a, $b) {
$x = $a * $b;
$y = floor($a * $b/pow(2,32));
return $x - $y * pow(2,32);
}
但在PHP(5.2.17)的结果是不一样的VB6。我认为这是由于一些舍入错误。我还在函数“multilong”中测试了一些其他舍入函数,也不使用它。
在PHP中有什么实现RSHash算法(我发现一些在许多其他语言,但不是PHP)? 如果没有(也许这是不可能的),有没有人有关于如何处理这个问题的建议?
在此先感谢!
解决方案:我们创建了一个计算哈希值的VB.net控制台应用程序。这个exe是从PHP调用来获得正确的。 看来,这是不可能的这个哈希算法转换成PHP。
2014-03-13
mindhead