【发布时间】:2012-08-15 07:20:56
【问题描述】:
我打算将文件名和其他详细信息存储在一个表中,我打算使用文件名的 sha1 哈希作为 PK。
第一季度。 SHA1 PK 不会是一个顺序增加/减少的数字。 那么,数据库是否会消耗更多资源 维护/search_into 并索引该键?如果我决定将其作为 40 个字符值保存在数据库中。
第二季度。我在这里读到: https://stackoverflow.com/a/614483/986818 将数据存储为 二进制(20)字段。有人可以在这方面给我建议吗:
- a) 我必须将此列创建为:TYPE=integer, LENGTH=20,
COLLATION=binary,ATTRIBUTES=binary? - b) 如何将 MySQL 或 Perl 中的 sha1 值转换为存储到 桌子?
- c) 这 20 个字符的值是否存在重复的危险?
**
---------更新-------------
**
要求是在文件名上搜索表。用户提供文件名,我去搜索表,如果文件名不存在,则添加它。因此,要么我在 varchar(100) 文件名字段上编制索引,要么生成一个带有文件名 sha1 的列 - 希望与索引 varchar 字段相比,为 MySql 编制索引会更容易。我也可以使用我的程序中的 sha1 值对 sha1 列进行搜索。说啥?主键或只是索引键:我选择 PK 因为 DBIx 喜欢使用 PK。并且 PK 或 INDEX+UNIQ 对系统来说将是相同数量的开销(所以我认为)
【问题讨论】:
-
为什么将哈希用作 PK 而不仅仅是具有传统 PK (Guid/int) 的唯一列?
-
另外,请记住哈希不是唯一的。无限数量的数据输入映射到相同的哈希值(尽管我不知道对于特定的哈希算法,这是否是每个可能的哈希值的情况。可能有一些只有有限数量的数据输入对于某些哈希值)。
-
我在这里遗漏了什么吗?我假设您的文件名附有位置?由于名称/位置应该是唯一的,只需使用已经自动递增的 pk,并在文件名和位置上使用单独的唯一键。