php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Request #53213 Adler32 algorithm is very slow
Submitted: 2010-10-31 18:22 UTC Modified: 2010-11-08 10:35 UTC
From: zavasek at yandex dot ru Assigned: aharvey
Status: Closed Package: hash related
PHP Version: 5.3.3 OS: Any
Private report: No CVE-ID:
 [2010-10-31 18:22 UTC] 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

Patches

patch.txt (last revision 2010-11-01 18:30 UTC) by zavasek at yandex dot ru)

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2010-10-31 19:14 UTC] pajoye@php.net
-Status: Open +Status: Feedback
 [2010-10-31 19:14 UTC] pajoye@php.net
Can you provide a patch and attach it to this bug please ("Add a patch")?
 [2010-10-31 20:40 UTC] zavasek at yandex dot ru
-Status: Feedback +Status: Open
 [2010-10-31 20:40 UTC] zavasek at yandex dot ru
I've never used SVN and do not know how to create patches.
 [2010-10-31 20:45 UTC] pajoye@php.net
-Status: Open +Status: Feedback
 [2010-10-31 20:45 UTC] pajoye@php.net
svn diff > mypatch.txt

and upload mypatch.txt here using the Add Patch link.
 [2010-11-02 04:05 UTC] aharvey@php.net
-Status: Feedback +Status: Open
 [2010-11-08 10:35 UTC] aharvey@php.net
Automatic comment from SVN on behalf of aharvey
Revision: http://svn.php.net/viewvc/?view=revision&amp;revision=305193
Log: Implemented FR #53213 (Adler32 algorithm is very slow). Patch by zavasek at
yandex dot ru.
 [2010-11-08 10:35 UTC] aharvey@php.net
-Status: Open +Status: Closed -Assigned To: +Assigned To: aharvey
 [2010-11-08 10:35 UTC] aharvey@php.net
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!
 
PHP Copyright © 2001-2014 The PHP Group
All rights reserved.
Last updated: Thu Apr 17 03:01:55 2014 UTC