【问题标题】:Getting the result of OPENSSL SHA1() function into an ARRAY将 OPENSSL SHA1() 函数的结果放入 ARRAY
【发布时间】:2010-12-23 04:43:41
【问题描述】:

我正在做一个项目,我遇到了一些问题。我已经搜索但找不到任何满意的答案。

我有一个由 0 和 1 组成的大文件。 我将 1024(我的块)位放入一个数组块中,然后我应用在 openssl/sha.h 库中实现的 SHA1() 函数。

字符块[1024]; while((fgets(chunk,1024,fp))!=NULL)

我的意图是我的文件可以包含相同的块,我想计算有多少块是相同的。

在我的数组块中获得 1024 位后,我申请:

无符号字符 obuf[20];

SHA1(块,strlen(块), obuf); 函数来获取哈希函数的结果。

SHA1 函数是如何工作的

unsigned char *SHA1(const unsigned char *d, unsigned long n,unsigned char *md);

之后我想将我的哈希函数结果存储在一个数组中。在我读取所有文件后,我将使用这个数组来比较是否有相同的哈希结果,这样我就可以开始我的项目了.但我坚持这一点。我无法将结果 obuf 放入数组中。

我试过了: 内存复制() strcopy() 或者只是 myarray[N][20]=obuf;等等

如果你有什么建议,我会很高兴谢谢。

所以最大的问题是找到多少个哈希是唯一的?

【问题讨论】:

    标签: c openssl sha1


    【解决方案1】:

    首先,您说您的输入文件块的大小为 1024 - 但是这一行将从您的文件中读取最多 1023 个字符(它使用一个空格空终止符):

    char chunk[1024]; while((fgets(chunk,1024,fp))!=NULL)
    

    (我认为fread 可能更接近您在这里尝试做的事情)

    其次,您可以执行以下操作:

    #define MAX_CHUNKS 1000
    
    unsigned char chunk[1024];
    unsigned char obuf[MAX_CHUNKS][20];
    int chunk_n = 0;
    
    while (fread(chunk, sizeof chunk, 1, fp) > 0 && chunk_n < MAX_CHUNKS)
    {
        SHA1(chunk, sizeof chunk, obuf[chunk_n++]);
    }
    
    /* Now have chunk_n SHA1s stored in obuf[0] through obuf[chunk_n -1] */
    

    【讨论】:

    • 我只是在尝试,这是有道理的。你是对的,这一行最多读取 1023,但我可以修改我的问题,只是将它放入数组中......
    • 您需要使用函数memcmp(obuf[i], obuf[j], 20) 来比较哈希值。如果两个哈希值相等,memcmp 将返回 0。我认为您可能需要复习您的 C 基础知识...
    • 这并不像你想象的那么容易,因为让我们认为我的哈希是 [5,4,5,4,3,3,2,1,5,2] 很难使用memcmp.(c 初学者)
    • 您确定要使用 C 吗?具有唯一键等的容器在例如蟒蛇或perl。甚至是 C++。在 C 中,最简单的事情是简单的线性搜索,但哈希表可能会出现问题。更快。
    • 没有你想的那么复杂。寻找独特的元素就是比较,至少一开始是这样。 caf 绝对为您指明了正确的方向。
    猜你喜欢
    • 2021-04-11
    • 2023-01-14
    • 1970-01-01
    • 2022-01-25
    • 2019-03-17
    • 2021-11-11
    • 2011-11-28
    • 1970-01-01
    • 2014-02-03
    相关资源
    最近更新 更多