【问题标题】:Hash lookup table primary key哈希查找表主键
【发布时间】:2016-04-14 13:52:32
【问题描述】:

我必须使用一组 $string,md5($string) CSV 文件填充数据库,本质上是一个哈希查找表。

我的问题是: 我应该使用字符串作为主键吗?哈希?添加额外的 ID 列?

我认为散列会很好,因为这就是我要询问数据库的内容,但是散列可能会发生冲突,无论如何字符串都应该是唯一的(以节省空间),但我想对此提出第二意见。

考虑到它将填充至少 35GB 的数据,我问的是性能问题。所以真的很感激任何建议

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    如果字符串将用于外键引用,那么我不会(必然)推荐散列。你可以:

    • 创建一个序列(自动递增)id 列作为主键。
    • name 上创建唯一索引。

    这应该有助于在表中查找以及验证 name 是唯一的。外键引用最好使用固定长度的数字,而不是可变长度的字符串。

    如果您使用哈希值并且真的不希望重复,那么您将需要一些机制来区分具有相同哈希值的不同字符串。一个自然的选择是某种增量计数器——但这会让你非常接近只有计数器而没有散列的解决方案。我看不到在表中存储这样一个哈希值的好处。

    【讨论】:

    • 我进行密码审计和统计,我发现自己破解哈希只是为了发现它们是弱密码,我想我会预先计算所有可能的组合,了解简单密码的含义。 (长度、字符集等)我的查询将是 SELECT string FROM table WHERE hash = 'hash'
    • @John 。 . .但是,弱密码的哈希值可能与强密码相同。此外,我认为规则太多了——例如,重复一个字母“n”次或使用某人的名字等等。
    • 哈希冲突的可能性很小,即使在 MD5 中也是如此。另外,是的,我考虑过“n”的事情。我的问题是关于性能的。
    【解决方案2】:

    我最终使用了一个 SERIAL id 字段,所以我可以计算我有多少条目。

    最初的问题开始于我认为您只能使用 PRIMARY KEY 索引列。

    所以问题现在解决了,我刚刚正确索引并且性能很棒!

    【讨论】:

    • 您可以使用serial 列来“计算”您拥有的行数。这些数字保证是无缝的,如果您删除行,这些 id 将不会被重新使用。
    • 哇!谢谢楼上的提醒,没看懂。不过,在这种特定情况下,我相信我不会删除任何条目。
    猜你喜欢
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    相关资源
    最近更新 更多