【发布时间】:2011-07-01 03:59:47
【问题描述】:
我想知道如何存储哈希 在Fossil SCM 中,SHA1 哈希存储为长度为 40 的文本。
CREATE TABLE blob(
rid INTEGER PRIMARY KEY,
rcvid INTEGER,
size INTEGER,
uuid TEXT UNIQUE NOT NULL,
content BLOB,
CHECK( length(uuid)==40 AND rid>0 )
);
sqlite> select * from blob;
1|1|169|6fc9d28454d4d070ca863bbbdbf9835f3505d585|
2|2|687|f59c73c1dbdea48cd2330d5a309445d756fc6901|
3|2|221|84ddeef14a657366246e6d9dcb11e2b3669cd896|
4|3|695|0311113ca8c18fb3e83c9e35e0e49e373c089f08|
5|3|224|5c577d268419caea733544ba5c81932beead3bf7|
对于像我这样的外行来说,每个字符需要 8 位并给出 4 (0-f) 似乎效率低下。我也发现MySQL docs同意我的观点
存储十六进制的大小损失 CHAR 列中的字符串至少为 两次,最多八次,如果 值存储在使用的列中 utf8 字符集(其中每个 字符使用 4 个字节)。存储 字符串也会导致速度变慢 因为比较大 价值观和性格的需要 考虑设置排序规则。
是不是这个列没有用作键,因此它的大小不是什么大问题?不,先生!从src/content.c@content_put:475我们可以看到
db_prepare(&s1, "SELECT rid, size FROM blob WHERE uuid=%B", &hash);
化石开发者比我聪明,所以哈希可能以某种方式以紧凑的二进制形式存储,但我不明白这是怎么回事。
【问题讨论】:
标签: database-design hash fossil