Во-первых, вы, вероятно, на самом деле не хотите, чтобы целые числа были фактически уникальными. Если вы это сделаете, то ваши номера могут быть неограниченными по размеру. Если это действительно то, что вам нужно, вы можете использовать библиотеку bignum и интерпретировать биты строки как представление (потенциально очень большого) целого числа. Если ваши строки могут содержать символ \ 0, тогда вам следует добавить 1, чтобы вы могли различить, например, "\ 0 \ 0" из "\ 0".
Теперь, если вы предпочитаете числа ограниченного размера, вы будете использовать некоторую форму хеширования. MD5 будет работать, но это излишне для заявленной цели. Я рекомендую вместо этого использовать sdbm, он работает очень хорошо. В Си это выглядит так:
static unsigned long sdbm(unsigned char *str)
{
unsigned long hash = 0;
int c;
while (c = *str++)
hash = c + (hash << 6) + (hash << 16) - hash;
return hash;
}
Источник, http://www.cse.yorku.ca/~oz/hash.html, также представляет несколько других хеш-функций.