Большинство алгоритмов хеширования работают с блоками данных фиксированного размера - вы можете, например, искать эталонные реализации SHA1 или MD5, они используют конструкцию «init / loop {update} / finalize», позволяющую вам передавать столько данных, скольковы хотите в каждом обновлении.
Взглянув, например, на Skein, они используют ту же концепцию в своей эталонной реализации:
int Skein_256_Init (Skein_256_Ctxt_t *ctx, size_t hashBitLen);
int Skein_256_Update(Skein_256_Ctxt_t *ctx, const u08b_t *msg, size_t msgByteCnt);
int Skein_256_Final (Skein_256_Ctxt_t *ctx, u08b_t * hashVal);
Почему вы считаете, что вам нужно передавать все данные как один блок??Вы смотрите на упрощенные функции оболочки?