How can I hash a string to an int using c++?

前端 未结 10 1754
长发绾君心
长发绾君心 2020-12-29 07:27

I have to write my own hash function. If I wanted to just make the simple hash function that maps each letter in the string to a numerical value (i.e. a=1, b=2, c=3, ...), i

相关标签:
10条回答
  • 2020-12-29 08:14

    Re the first question, sure, e.g, something like:

    int hash = 0;
    int offset = 'a' - 1;
    for(string::const_iterator it=s.begin(); it!=s.end(); ++it) {
      hash = hash << 1 | (*it - offset);
    }
    

    regarding the second, there are many better ways to hash strings. E.g., see here for a few C examples (easily translatable to C++ along the lines of the snippet above).

    0 讨论(0)
  • 2020-12-29 08:15
    #include <iostream>
    #include <string>
    #include <algorithm>
    
    using namespace std;
    
    // a variation on dan bernstein's algorithm
    // [http://www.cse.yorku.ca/~oz/hash.html]
    template<typename Int>
    struct hash {
        hash() : acc(5381) { }
        template<typename Ch>
        void operator()(Ch ch) { acc = ((acc << 5) + acc) ^ ch; }
        operator Int() const { return acc; }
        Int acc;
    };
    
    int main(int argc, char* argv[])
    {
        string s("Hellp, world");
        cout << hex << showbase
            << for_each(s.begin(), s.end(), hash<unsigned long long>()) << '\n';
        return 0;
    }
    
    0 讨论(0)
  • 2020-12-29 08:22

    From personal experience I know that this works and produces good distributions. (Plagiarised from http://www.cse.yorku.ca/~oz/hash.html):

    djb2

    this algorithm (k=33) was first reported by dan bernstein many years ago in comp.lang.c. another version of this algorithm (now favored by bernstein) uses xor: hash(i) = hash(i - 1) * 33 ^ str[i]; the magic of number 33 (why it works better than many other constants, prime or not) has never been adequately explained.

    unsigned long hash(unsigned char *str) {
        unsigned long hash = 5381;
        int c;
    
        while (c = *str++) {
            hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
        }
    
        return hash;
    }
    
    0 讨论(0)
  • 2020-12-29 08:23

    You can make use of the member functions operator[] or at of the string class or iterators to access individual char of a string object without converting it to c-style char array.

    To hash a string object to an integer you'll have to access each individual char of the string object which you can do as:

    for (i=0; i < str.length(); i++) {
        // use str[i] or str.at(i) to access ith element.
    }
    
    0 讨论(0)
提交回复
热议问题