From 7a3b00b10b6a5a740e07fc1b68a4f3fb3bcdac23 Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Tue, 27 Sep 2016 18:20:02 +0200 Subject: 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. --- apt-pkg/contrib/strutl.h | 5 +++++ apt-pkg/deb/deblistparser.cc | 2 +- apt-pkg/pkgcache.cc | 6 +++--- 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 @@ -140,6 +140,11 @@ bool CheckDomainList(const std::string &Host, const std::string &List); #define tolower_ascii tolower_ascii_inline #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) { 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(); } -- cgit v1.2.3