如何获得SHA1函数的最后64位?

时间:2014-05-23 19:00:54

标签: c cryptography sha1

我正在开发需要在不同服务器上分发文件的项目。对于分配方案,我选择使用SHA1算法并取最后64位(160位散列)来识别文件。

我不确定这是不是我的错,但是我无法将int作为最后64位哈希值的稳定值。

我试过的是:

   char *plaintext = "file";
   size_t len = strlen(plaintext);
   char hash[41];

   /*hash contains the hash of the file as char* */
   plaintext_to_sha1(hash, plaintext, len);

   /*get last 64 bits of the hash*/
   uint64_t  value = (uint64_t)(hash + (24 * sizeof(char)));
   printk(LOG_LEVEL "value: %llu\n", value);

value包含的值有时会有所不同,我不明白我做错了什么。我将最后的64位转换为int,向右移动24个字节的散列。

任何建议都表示赞赏。

2 个答案:

答案 0 :(得分:0)

使用以下内容:

memcpy(&value,hash+12,8);

答案 1 :(得分:0)

我认为memcpy没有给出正确的答案。我解决同样问题的方法是使用strtoull(将字符串转换为64位整数)。您需要确保您的编译器首先支持它。

在您的情况下,您可以像这样使用它:

unsigned long long int value = 0;
value = strtoull(hex_hash + 24, NULL, 16);

其中hex_hash是散列的40字节十六进制表示。使用%ull打印时,会给出正确的值,而memcpy返回的值不同。

您可以检查正确性here