Review of OP's post and [answer](https://codereview.stackexchange.com/a/237115/29485).
`strlen(input);` can exceed `INT_MAX`. `size_t const inputLen = strlen(input); size_t i, j;` is better.
`char *digest` as `unsigned char *digest` would negate the need for `abs()` in `abs(digest[i])`
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`.
`char *digest = malloc(HASH_LENGTH + 1); memset(digest, 0, HASH_LENGTH);` can be replaced with `char *digest = calloc(HASH_LENGTH + 1, sizeof *digest);`