2016-12-05 222 views
1

任何人都可以幫助我將此javascript函數轉換爲php嗎?將Javascript代碼轉換爲php

var t='[{"id_page":14,"in_visible":1,"in_insert":1,"in_update":1}]'; 
 
function hash (s) { 
 
    return s.split("").reduce(
 
     function(a, b) { 
 
     return a = (a << 5) - a + b.charCodeAt(0), a & a 
 
     }, 0 
 
).toString() 
 
} 
 
      
 
alert(hash(t));

我想這個PHP腳本:

function fun($a, $b) 
{ 
    return $a = ($a << 5) - $a + ord(substr($b,0,1));// $a & $a; 
} 

$v = '[{"id_page":14,"in_visible":1,"in_insert":1,"in_update":1}]'; 
$a = str_split($v); 
$r = array_reduce($a,'fun',0); 
print_r($r); 
+2

你應該採取刺傷它,然後如果你再卡住,後與您的代碼。 –

+0

堆棧不是轉換服務;先試一下。 –

回答

1

與您的代碼的問題: 雖然在所有的JS數字是6 4位浮點值,按位運算符(如位移和位),或者對32位整數進行操作。這就是爲什麼32位整數溢出發生在你的JS函數中,但在PHP函數中,這不會發生。

解決方法:您需要模擬PHP函數中的整數溢出,以實現與JS相同的輸出。這已經在this answer中完成了另一個問題。 該函數需要應用於每個二元運算符。在你的情況下,<<&(在你的js函數中看起來像a & a純粹用於在結果中創建一個32位整數)。

所以PHP函數返回相同的哈希值可能看起來像這樣:

<?php 
function intval32bits($value){ 
    $value = ($value & 0xFFFFFFFF); 
    if ($value & 0x80000000) 
     $value = -((~$value & 0xFFFFFFFF) + 1); 
    return $value; 
} 

function fun($a, $b){ 
    return intval32bits(doOverflow32b($a << 5) - $a + ord($b[0])); 
} 

$v = '[{"id_page":14,"in_visible":1,"in_insert":1,"in_update":1}]'; 
$a = str_split($v); 
$r = array_reduce($a,'fun',0); 
print_r($r); 
0

function fun($a, $b) 
{ 
    $a = $a & $a; 
    return $a = ($a << 5) - $a + ord(substr($b,0,1));// $a & $a; 
} 

$v = '[{"id_page":14,"in_visible":1,"in_insert":1,"in_update":1}]'; 
$a = str_split($v); 
$r = array_reduce($a,'fun',0); 
print_r($r); 
+0

你是否發佈這個作爲你自己的問題的答案?我不認爲這會和你的js功能產生同樣的結果。也許你想編輯你的問題? –