summaryrefslogtreecommitdiff
path: root/apt-pkg
diff options
context:
space:
mode:
authorJulian Andres Klode <jak@debian.org>2016-09-27 18:20:02 +0200
committerJulian Andres Klode <jak@debian.org>2016-11-22 22:58:18 +0100
commit7a3b00b10b6a5a740e07fc1b68a4f3fb3bcdac23 (patch)
tree4a46568d49227b6ae8c6d614d247b8f1ed582997 /apt-pkg
parent1236419d67e119acc7c0df48f8b14a277e0b5683 (diff)
Introduce tolower_ascii_unsafe() and use it for hashing
This one has some obvious collisions for non-alphabetical characters, like some control characters also hashing to numbers, but we don't really have those, and these are hash functions which are not collision free to begin with.
Diffstat (limited to 'apt-pkg')
-rw-r--r--apt-pkg/contrib/strutl.h5
-rw-r--r--apt-pkg/deb/deblistparser.cc2
-rw-r--r--apt-pkg/pkgcache.cc6
3 files changed, 9 insertions, 4 deletions
diff --git a/apt-pkg/contrib/strutl.h b/apt-pkg/contrib/strutl.h
index f3591d65f..918ac89c7 100644
--- a/apt-pkg/contrib/strutl.h
+++ b/apt-pkg/contrib/strutl.h
@@ -141,6 +141,11 @@ bool CheckDomainList(const std::string &Host, const std::string &List);
#define isspace_ascii isspace_ascii_inline
APT_CONST APT_HOT
+static inline int tolower_ascii_unsafe(int const c)
+{
+ return c | 0x20;
+}
+APT_CONST APT_HOT
static inline int tolower_ascii_inline(int const c)
{
return (c >= 'A' && c <= 'Z') ? c + 32 : c;
diff --git a/apt-pkg/deb/deblistparser.cc b/apt-pkg/deb/deblistparser.cc
index 43fc4aa3a..549e75952 100644
--- a/apt-pkg/deb/deblistparser.cc
+++ b/apt-pkg/deb/deblistparser.cc
@@ -369,7 +369,7 @@ unsigned short debListParser::VersionHash()
{
if (isspace_ascii(*Start) != 0)
continue;
- *J++ = tolower_ascii(*Start);
+ *J++ = tolower_ascii_unsafe(*Start);
/* Normalize <= to < and >= to >. This is the wrong way around, but
* more efficient that the right way. And since we're only hashing
diff --git a/apt-pkg/pkgcache.cc b/apt-pkg/pkgcache.cc
index e7e417a5a..b0ba1597f 100644
--- a/apt-pkg/pkgcache.cc
+++ b/apt-pkg/pkgcache.cc
@@ -213,14 +213,14 @@ map_id_t pkgCache::sHash(StringView Str) const
{
uint32_t Hash = 5381;
for (auto I = Str.begin(); I != Str.end(); ++I)
- Hash = 33 * Hash + tolower_ascii(*I);
+ Hash = 33 * Hash + tolower_ascii_unsafe(*I);
return Hash % HeaderP->GetHashTableSize();
}
map_id_t pkgCache::sHash(const string &Str) const
{
uint32_t Hash = 5381;
for (string::const_iterator I = Str.begin(); I != Str.end(); ++I)
- Hash = 33 * Hash + tolower_ascii((signed char)*I);
+ Hash = 33 * Hash + tolower_ascii_unsafe((signed char)*I);
return Hash % HeaderP->GetHashTableSize();
}
@@ -228,7 +228,7 @@ map_id_t pkgCache::sHash(const char *Str) const
{
uint32_t Hash = 5381;
for (const char *I = Str; *I != 0; ++I)
- Hash = 33 * Hash + tolower_ascii((signed char)*I);
+ Hash = 33 * Hash + tolower_ascii_unsafe((signed char)*I);
return Hash % HeaderP->GetHashTableSize();
}