ハッシュをどのように保存すればよいのか疑問に思いました。FossilSCMでは、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のドキュメントが私に同意することもわかりました
16進文字列をCHAR列に格納する場合のサイズのペナルティは、少なくとも2倍、値がutf8文字セット(各文字が4バイトを使用する)を使用する列に格納されている場合は最大8倍です。文字列を保存すると、値が大きくなり、文字セットの照合規則を考慮する必要があるため、比較が遅くなります。
この列はキーとして使用されていないので、そのサイズはそれほど重要ではありませんか?いいえ!からsrc/content.c@content_put:475
見ることができます
db_prepare(&s1, "SELECT rid, size FROM blob WHERE uuid=%B", &hash);
化石開発者は私より賢いので、ハッシュはおそらくどういうわけかコンパクトなバイナリ形式で保存されていますが、それがどれほど正確に起こっているのかわかりません。