Edit report at http://bugs.php.net/bug.php?id=53213&edit=1

 ID:                 53213
 Updated by:         [email protected]
 Reported by:        zavasek at yandex dot ru
 Summary:            Adler32 algorithm is very slow
-Status:             Open
+Status:             Closed
 Type:               Feature/Change Request
 Package:            hash related
 Operating System:   Any
 PHP Version:        5.3.3
-Assigned To:        
+Assigned To:        aharvey
 Block user comment: N

 New Comment:

This bug has been fixed in SVN.

Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.
 
Thank you for the report, and for helping us make PHP better.

Patch committed to trunk. Thanks very much!


Previous Comments:
------------------------------------------------------------------------
[2010-11-08 10:35:36] [email protected]

Automatic comment from SVN on behalf of aharvey
Revision: http://svn.php.net/viewvc/?view=revision&revision=305193
Log: Implemented FR #53213 (Adler32 algorithm is very slow). Patch by
zavasek at
yandex dot ru.

------------------------------------------------------------------------
[2010-10-31 20:45:28] [email protected]

svn diff > mypatch.txt



and upload mypatch.txt here using the Add Patch link.

------------------------------------------------------------------------
[2010-10-31 20:40:47] zavasek at yandex dot ru

I've never used SVN and do not know how to create patches.

------------------------------------------------------------------------
[2010-10-31 19:14:48] [email protected]

Can you provide a patch and attach it to this bug please ("Add a
patch")?

------------------------------------------------------------------------
[2010-10-31 18:22:17] zavasek at yandex dot ru

Description:
------------
Now adler32 algorithm for each byte uses two operations " % 65521". It
is very slow.

I propose to change the function PHP_ADLER32Update in the file
hash_adler32.c

{

        php_hash_uint32 i, s[2];

        

        s[0] = context->state & 0xffff;

        s[1] = (context->state >> 16) & 0xffff;

        for (i = 0; i < len; ++i) {

                s[0] += input[i];

                s[1] += s[0];

                if (s[1]>0x7fffffff)

                {

                        s[0] = s[0] % 65521;

                        s[1] = s[1] % 65521;

                }

        }

        s[0] = s[0] % 65521;

        s[1] = s[1] % 65521;

        context->state = s[0] + (s[1] << 16);

}

Test script:
---------------
<?php

$t = microtime(true);

echo hash_file('adler32','/home/user/testfile')."\n"; // I used testfile
size 400 MB with random content

echo sprintf('%0.3d',(microtime(true)-$t)*1000)." ms\n\n";

?>

Actual result:
--------------
PHP 5.3.3 showed:

85ffb2c5

2174 ms



After modification the file:

85ffb2c5

664 ms



Speed was higher than about 3 times


------------------------------------------------------------------------



-- 
Edit this bug report at http://bugs.php.net/bug.php?id=53213&edit=1

Reply via email to