Review of OP's post and answer.
Bug
digest[i] ^= vars[input[j] % varsLen]; is undefined behavior, UB, when input[j] < 0.
Failure on long strings
strlen(input); can exceed INT_MAX. size_t const inputLen = strlen(input); size_t i, j; is better.
abs() not really needed
char *digest as unsigned char *digest would negate the need for abs() in abs(digest[i])
Fundamental issues as code uses char rather than unsigned char
Using unsigned char rather than char would improve hash quality and maybe speed over when char is signed.
char vars[] = { 0xA6, ... remains problematic as when char is signed, conversion of an out-of-range value to char is implementation defined and may not perform as desired. Simplify all this potential signed hashing with unsigned char. The return type can remain char *.
Simplification
char *digest = malloc(HASH_LENGTH + 1); memset(digest, 0, HASH_LENGTH); ...digest[HASH_LENGTH] = '\0'; can be replaced with char *digest = calloc(HASH_LENGTH + 1, sizeof *digest);