]> git.saurik.com Git - apt.git/commitdiff
Introduce tolower_ascii_unsafe() and use it for hashing
authorJulian Andres Klode <jak@debian.org>
Tue, 27 Sep 2016 16:20:02 +0000 (18:20 +0200)
committerJulian Andres Klode <jak@debian.org>
Tue, 22 Nov 2016 21:58:18 +0000 (22:58 +0100)
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
apt-pkg/deb/deblistparser.cc
apt-pkg/pkgcache.cc

index f3591d65feb5d2c049f67d2ca4b7618061e80291..918ac89c741832f41a00117bf006d86ccc00e827 100644 (file)
@@ -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
 
 #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)
 {
 APT_CONST APT_HOT
 static inline int tolower_ascii_inline(int const c)
 {
index 43fc4aa3a949e3f30edafd954ffc9cda87562270..549e75952885ad0af823ed791ecf261a61a2f9e5 100644 (file)
@@ -369,7 +369,7 @@ unsigned short debListParser::VersionHash()
       {
         if (isspace_ascii(*Start) != 0)
            continue;
       {
         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
 
         /* Normalize <= to < and >= to >. This is the wrong way around, but
          * more efficient that the right way. And since we're only hashing
index e7e417a5a818268ad75b051d0197e62e6ce7171a..b0ba1597fffdce6b772a074cfebb2defac9d3814 100644 (file)
@@ -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)
 {
    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)
    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();
 }
 
    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)
 {
    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();
 }
 
    return Hash % HeaderP->GetHashTableSize();
 }