summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2007-09-18 12:38:07 -0700
committerH. Peter Anvin <hpa@zytor.com>2007-09-18 12:38:07 -0700
commit5255fd1f36eece1cbf4000ffc3120dbcb9bf5038 (patch)
tree1b48eca6bea429f943bd77dcdf91be7e85a013c2
parent3ce3715fba17d5ad54278a42dd0fe75a5b0ebc8d (diff)
downloadnasm-5255fd1f36eece1cbf4000ffc3120dbcb9bf5038.tar.gz
Change the token prehash function for better convergence
Combining arithmetric (add) and bitwise (xor) mixing seems to give better result than either. With the new prehash function, we find a valid hash much quicker.
-rw-r--r--perllib/phash.ph4
-rwxr-xr-xpptok.pl4
-rwxr-xr-xtokhash.pl4
3 files changed, 6 insertions, 6 deletions
diff --git a/perllib/phash.ph b/perllib/phash.ph
index 60334272..3bb3a05b 100644
--- a/perllib/phash.ph
+++ b/perllib/phash.ph
@@ -42,8 +42,8 @@ sub prehash($$$) {
foreach $c (unpack("C*", $key)) {
$ko1 = $k1; $ko2 = $k2;
- $k1 = int32(rot($ko1,$s0)-rot($ko2, $s1)+$c);
- $k2 = int32(rot($ko2,$s2)-rot($ko1, $s3)+$c);
+ $k1 = int32(rot($ko1,$s0)^int32(rot($ko2, $s1)+$c));
+ $k2 = int32(rot($ko2,$s2)^int32(rot($ko1, $s3)+$c));
}
# Create a bipartite graph...
diff --git a/pptok.pl b/pptok.pl
index a0425b7c..a835bf3e 100755
--- a/pptok.pl
+++ b/pptok.pl
@@ -191,8 +191,8 @@ if ($what eq 'c') {
print OUT " while ((c = *p++) != 0) {\n";
print OUT " uint32_t kn1, kn2;\n";
print OUT " c |= 0x20; /* convert to lower case */\n";
- printf OUT " kn1 = rot(k1,%2d) - rot(k2,%2d) + c;\n", ${$sv}[0], ${$sv}[1];
- printf OUT " kn2 = rot(k2,%2d) - rot(k1,%2d) + c;\n", ${$sv}[2], ${$sv}[3];
+ printf OUT " kn1 = rot(k1,%2d)^(rot(k2,%2d) + c);\n", ${$sv}[0], ${$sv}[1];
+ printf OUT " kn2 = rot(k2,%2d)^(rot(k1,%2d) + c);\n", ${$sv}[2], ${$sv}[3];
print OUT " k1 = kn1; k2 = kn2;\n";
print OUT " }\n";
print OUT "\n";
diff --git a/tokhash.pl b/tokhash.pl
index 5f1a9f4c..9d5888be 100755
--- a/tokhash.pl
+++ b/tokhash.pl
@@ -187,8 +187,8 @@ print " const char *p = token;\n";
print "\n";
print " while ((c = *p++) != 0) {\n";
-printf " uint32_t kn1 = rot(k1,%2d) - rot(k2,%2d) + c;\n", ${$sv}[0], ${$sv}[1];
-printf " uint32_t kn2 = rot(k2,%2d) - rot(k1,%2d) + c;\n", ${$sv}[2], ${$sv}[3];
+printf " uint32_t kn1 = rot(k1,%2d)^(rot(k2,%2d) + c);\n", ${$sv}[0], ${$sv}[1];
+printf " uint32_t kn2 = rot(k2,%2d)^(rot(k1,%2d) + c);\n", ${$sv}[2], ${$sv}[3];
print " k1 = kn1; k2 = kn2;\n";
print " }\n";
print "\n";