module hash;

import std.stdio;
import std.conv;

extern (C) {
  int crypto_generichash(ubyte *output, size_t outlen,
      const ubyte *input, ulong inlen,
      const ubyte *key, size_t key);

  size_t crypto_generichash_bytes();
}

string generichash(string input) {
  return cast(string)generichash(cast(ubyte[])input);
}

ubyte[] generichash(ubyte[] input) {
  ubyte[] output = new ubyte[crypto_generichash_bytes()];
  assert(crypto_generichash(&output[0], output.length,
      &input[0], input.length, null, 0) == 0);
  return output;
}

unittest {
  const string TEST = "THIS IS A TEST";
  assert(generichash(TEST) == generichash(TEST));
  assert(generichash(cast(ubyte[])TEST) == generichash(TEST));
}