0

我想知道我应该如何存储散列在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 文档同意我的看法

将十六进制字符串存储在 CHAR 列中的大小损失至少是两倍,如果该值存储在使用 utf8 字符集(其中每个字符使用 4 个字节)的列中,则高达八倍。由于值较大并且需要考虑字符集排序规则,存储字符串还会导致比较慢。

是不是该列没有用作键,因此它的大小不是什么大问题?不,先生!从src/content.c@content_put:475我们可以看到

db_prepare(&s1, "SELECT rid, size FROM blob WHERE uuid=%B", &hash);

化石开发者比我聪明,所以哈希可能以某种方式以紧凑的二进制形式存储,但我不明白这是怎么发生的。

4

2 回答 2

1

OP是对的,它效率低下。但是它有助于调试软件,并且占用的空间相对较小,因此它是开发人员便利性和效率之间的折衷。

于 2011-02-21T13:35:33.820 回答
0

Fossil 根本不依赖 MySQL 数据库,而是依赖 SQLite 数据库。SQLite 数据库具有弱类型

于 2011-02-21T09:49:02.920 回答