Почему Fossil SCM использует TEXT для хранения хэшей? - PullRequest
0 голосов
/ 21 февраля 2011

Мне было интересно, как хранить хеш В 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);

Разработчик окаменелостей умнее меня, поэтому хэш, вероятно, каким-то образом хранится в компактной двоичной форме, однако я не понимаю, как именно это происходит.

Ответы [ 2 ]

1 голос
/ 21 февраля 2011

ОП верен, он неэффективен.Однако это помогает отладить программное обеспечение и занимает относительно небольшое количество места, поэтому это компромисс между удобством разработчика и эффективностью.

0 голосов
/ 21 февраля 2011

Fossil вообще не полагается на базу данных MySQL, а на базу данных SQLite. База данных SQLite имеет слабую типизацию .

...