Переглянути джерело

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.
Julian Andres Klode 9 роки тому
батько
коміт
7a3b00b10b
3 змінених файлів з 9 додано та 4 видалено
  1. 5 0
      apt-pkg/contrib/strutl.h
  2. 1 1
      apt-pkg/deb/deblistparser.cc
  3. 3 3
      apt-pkg/pkgcache.cc

+ 5 - 0
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)
 {

+ 1 - 1
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

+ 3 - 3
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();
 }