HashTable - separate chaining collision in C++
You're attempting to read values from uninitialized variables which has undefined behavior:

int sum; // uninitialized`  
for(int i=0; i &lt; length; i++){`  
    sum+=e[i]; // reading from uninitialized variable "sum"


Read this
From "HASHSET_H_" I gather it's a header file.
You should never use using namespace std; in a header file (and chances are it's a bad idea to use it anywhere else, too -- unless you're porting legacy 1980s C code to C++):

Link 1
Link 2
If you can use C++11 then nullptr is a better choice than NULL: read this

// Note, however, that if you're NOT using C++11, then the following is a potential performance problem:
int HashSet&lt;Element&gt;::HashFunction(string e)
Pre-C++11 this can create unnecessary copy, so prefer to pass-by-const-reference in C++98/03 instead.

Compare:

copy
move
no copy (elided)
int is a wrong type for a variable holding size or count (such as hashSize, bucketSize, totElems).
In particular, this is very bad: int length = e.size();
Not only you're using a wrong type, but potentially also losing performance due to unsigned-to-signed conversion // which, perhaps more importantly, is completely unnecessary and only makes the code harder to read -- are you suggesting that length can be negative? If not, then don't use int.

Prefer std::size_t instead (defined in header &lt;cstddef&gt;):

Link 1
Link 2
Make sure to use meaningful variable names. This includes not using ambiguous abbreviations. totElems is not a good name. totalElementsCount is better.
Additional idea: make sure to pick a naming convention and stick to it.
For instance, some of your functions start with uppercase character, like IsEmptyAtGivenKey, but some with a lowercase character, like setInfo.
It's better if they all follow the same convention (e.g., all functions start with lowercase, all types start with uppercase, etc.).

As a hint, read the "Naming" section from Google C++ Style Guide.

// Extra hint: feel free to completely ignore the other sections, or even take them as examples of what NOT to do (like the one on exceptions), unless you're working at Google with Google's code base.
Manual memory management is troubling.

I've read from your comments that this is for school, so chances are the class / teaching methods simply aren't exactly up-to-date (thinking teaching C before C++ is a good idea is often a good indicator), but IRL invoking raw new (such as here: new Node*[hashSize];) without a very good reason is nowadays unnecessary and considered a bad practice.

If you want to learn best practices, start with this.

// Not to repeat myself from my previous answer, here's a link to it, if you'd like more information on memory management specifically: here.