当前位置: 首页 > 知识库问答 >
问题:

操作SHA256哈希的大型文本数据库的最有效方法?

佘茂才
2023-03-14

我必须经常在这种格式的大型(高达1G)CSV数据库中搜索哈希

sha256_hash, md5_hash, sha1_hash, field1, field2, field3 etc

在C.这需要非常快,内存使用不是问题(最低32G)。我发现这非常接近我的想法:将数据加载到内存中,一次性按哈希排序数据库,按哈希的第一个n字节索引,然后通过较小的子列表搜索。但是上面的帖子似乎没有解决我中间的一个问题。因为我不是一个密码学的家伙,我想知道哈希的分布,以及它是否可以用来更快地搜索子列表。对此或我的总体方法有什么建议吗?

共有3个答案

穆鸿卓
2023-03-14

散列的分布是统一的,这很有帮助,因为您可以将散列放在散列表中。

// something like this...
struct entry {
    bool used;
    unsigned char sha256[32];
    char field1[20];
    char field2[20];
};

如果您不需要从哈希表中删除条目,只需创建一个大数组结构条目,并将CSV中的记录插入到与SHA-256哈希中的一些位相对应的索引中。使用线性探测来插入条目:如果使用条目i,则使用i 1i 2,直到找到一个空闲条目。

struct table {
    int nbits;
    struct entry *entries;
};

unsigned read_int(unsigned char *data)
{
    unsigned v = data[0] | (data[1] << 8) |
                 (data[2] << 16) | ((unsigned)data[3] << 24);
}

struct entry *find_entry(struct table *table, unsigned char *sha256)
{
    unsigned index = read_int(sha256);
    unsigned mask = (1u << table->nbits) - 1;
    while (1) {
        struct entry *e = &table->entries[index & mask];
        if (!e->used)
            return NULL;
        if (!memcmp(e->sha256, sha256, 32))
            return e;
        index++;
    }
}
昝欣可
2023-03-14

这是一个非常容易用大量内存解决的问题。使哈希成为哈希表的键。将提供给表的哈希设置为哈希的前N个字节(因为它们是如此随机,地球上没有人能将它们与真正的随机数据区分开来)。

不确定您的想法是什么,用键前缀为表设置键,并使用子列表。任何提供哈希表的股票库都可以轻松解决您的问题。

或者将其放入任何数据库,并使哈希成为主键。

牧飞鹏
2023-03-14

是的,通过使用散列位的分布,布鲁姆过滤器可以用来提前剔除“明确的否定”。

http://en.wikipedia.org/wiki/Bloom_filter

要为给定的bucket创建bloomfilter,可以使用逻辑或所有散列来创建过滤器。然后,使用目标哈希对逻辑和筛选器进行排序。如果结果是

必须注意桶大小,以便产生有意义的过滤器,因为所有高位的过滤器对任何人都没有价值。

 类似资料:
  • 底层实现是hash table,一般操作复杂度是O(1),要同时操作多个field时就是O(N),N是field的数量。应用场景:土法建索引。比如User对象,除了id有时还要按name来查询。 可以有如下的数据记录: (String) user:101 -> {“id”:101,”name”:”calvin”…} (String) user:102 -> {“id”:102,”name”:”ke

  • 我一直在使用来存储键值对,其中键和值都是sha256哈希摘要。我需要能够找出列表中是否存在一个键,并且能够检索该dict的值。 目前,根据我的一些测试,我估计需要大约10Gb的内存来存储8000000个哈希,因为实际存储的数据只有512MB(每个哈希32字节,所以每个记录64字节) 有人有什么建议吗? 更新,基于我认为应该更新的一些评论。我将散列存储为字节,而不是十六进制字符串。我使用sqlite

  • 我想向用户展示他们的客户端工具也可能生成的散列,因此我一直在比较在线散列工具。我的问题是关于它们的散列形式,因为奇怪的是,它们是不同的。 在快速搜索之后,我用5进行了测试: http://www.convertstring.com/hash/sha256 http://www.freeformatter.com/sha256-generator.html#ad-output http://onli

  • hlen key 返回指定hash的field数量

  • 问题内容: 我需要计算大文件(或其一部分)的SHA-256哈希。我的实现工作正常,但比C 的CryptoPP计算要慢得多(25分钟vs. 30 GB文件的10分钟)。我需要的是在C 和Java中执行时间相似,因此散列几乎可以同时准备好。我也尝试了Bouncy Castle的实现,但是它给了我相同的结果。这是我如何计算哈希值: 问题答案: 我的解释可能无法解决您的问题,因为它很大程度上取决于您的实际

  • 问题内容: 我需要从超过2GB的文件中更新最后一行,这些文件由无法读取的文本行组成。目前,它可以通过逐行循环工作。但是,我想知道是否有任何编译的库可以更有效地实现这一目标?谢谢! 目前的方法 问题答案: 更新:使用ShadowRanger的答案。它更短且更健壮。 对于后代: 读取文件的最后N个字节,然后向后搜索换行符。