PHP C müzakere dönüştürme fonksiyonu: ezmlm_hash

0 Cevap php

Benim sunucuda PHP 5.2.x 5.3.2 yükseltmek için çalışıyorum. Sorun PHP'nin ezmlm_hash ve broken uygulanmasına dayanarak, olan () (bug burada özetlenmiştir: http://bugs.php.net/bug.php?id=47969).

Benim ilk düşünce PHP yerli PHP fonksiyon kırık sürümü (C ile yazılmış olan) kendimi yeniden yazmak yerine PHP kaynak kodunu değiştirerek ve kaynak PHP derlemek zorunda, benim kodunda olduğunu kullanımı oldu.

İşte kod C versiyonu:

PHP_FUNCTION(ezmlm_hash)
{
    char *str = NULL;
    unsigned int h = 5381L;
    int j, str_len;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s",
                              &str, &str_len) == FAILURE) {
        return;
    }

    for (j = 0; j < str_len; j++) {
        h = (h + (h << 5)) ^ (unsigned long) (unsigned char) tolower(str[j]);
    }

    h = (h % 53);

    RETURN_LONG((int) h);
}

Burada PHP yazdık budur:

function ezmlm_hash_mine($email_address){
    $h = 5381;
    $email_length = strlen($email_address);
    for($x=0;$x<$email_length;$x++){
        $chr = strtolower($email_address[$x]);
        $h = ($h + ($h << 5)) ^ ( ord($chr) );
    }

    $h = $h % 53;
    return $h;
}

Ben bir 64-bit makine kullanıyorum. İki fonksiyonları çıkışı değişik sonuçlar:

$email_addresses = array(
    'test@example.com',
    'mike@example.com',
);

print('<PRE>');

foreach($email_addresses as $email_address){
    print(ezmlm_hash($email_address).PHP_EOL);
    print(ezmlm_hash_mine($email_address).PHP_EOL.PHP_EOL);
}

çıktı:

23
-52

15
-21

Ben sadece bunu düzeltmek için nasıl emin değilim, muhtemelen bazı hassas veya yazarak sorunları var biliyorum. Herhangi bir yardım büyük mutluluk duyacağız!

UPDATE

Ben thes 32 bit makinelerde kodu çalıştırdığınızda, her ikisi de çıktı yeni düzeltilmiş değerler:

12
12

45
45

Herkes C modül operatörü PHP eşdeğer biliyor ... Bu modül operatörü ile ilgisi olduğunu düşünüyorum? PHP% farklı davranır!

UPDATE 2

Bu vanilya PHP ile mümkün değildir sanki o kayan noktalı aritmetik bulunuyor gibi yeterli hassasiyete sahip ve garabeti değil, görünür. Ben BCMath veya GMP ya yüklemek zorundasınız. Herkesin fikir için teşekkürler.

0 Cevap