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 (profile)
Status: Closed Package: hash related
PHP Version: 5.3.3 OS: Any
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: zavasek at yandex dot ru
New email:
PHP Version: OS:

 

 [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)

Pull Requests

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-2024 The PHP Group
All rights reserved.
Last updated: Thu Nov 21 15:01:30 2024 UTC