[devel] Re: cmdcache hash function
Alexey Tourbin
=?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Чт Сен 15 13:26:51 MSD 2005
On Wed, Sep 14, 2005 at 09:10:04PM +0400, Alexey Tourbin wrote:
> Букв нет, есть только st_ino+st_size+st_mtime.
>
> at на solemn ~/.cmdcache 4 $ ls -1 rpmfile |head
> i10003s62465m1079085926
> i10226s323862m1079960217
> i10287s367587m1080138012
> i10366s1535556m1077197737
> i10552s68368m1077197738
> i10580s107898m1078145421
> i10723s828128m1076422307
> i1090192s13734m1125334673
> i11055s406941m1079109059
> i1166331s4611m1125335339
> at на solemn ~/.cmdcache 4 $
>
> К тому же по буквам получится плохое распределение, а кеш всё равно
> "не прозрачный" (то есть reverse lookup затруднён). Можно сделать
> одноуровневую прослойку из каталогов по последним цифрам ino и size.
> Получится 100 файлов на 100 каталогов для 10k capacity. Надо посмотреть
> как в ccache сделано.
Okay, есть три числа: st_ino, st_size и st_mtime. Как их по-грамотному
захешировать? Нужно сделать одноуровневую прослойку из каталогов. Для
capacity порядка 10k выбираем число каталогов (buckets) в районе 100:
$ for n in `seq 50 150`; do factor $n; done |awk NF==2
53: 53
59: 59
61: 61
67: 67
71: 71
73: 73
79: 79
83: 83
89: 89
97: 97
101: 101
103: 103
107: 107
109: 109
113: 113
127: 127
131: 131
137: 137
139: 139
149: 149
$
Значит хешируем по модулю например 97.
cmdcache_hash()
{
local c_st
c_st="$(stat -L -c '%i %s %Y' -- "$1")" || return
set -- $c_st
local c_hashfile="i${1}s${2}m${3}"
local c_hashdir=$(( ( $1 + $2 + $3 ) % 97 ))
echo "$c_hashdir/$c_hashfile"
}
bash-2.05b$ cmdcache_hash /etc/passwd
70/i22612s2957m1119749776
bash-2.05b$ exit
Коллеги! Как по-грамотному три числа захешировать?
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип : application/pgp-signature
Размер : 189 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url : <http://lists.altlinux.org/pipermail/devel/attachments/20050915/98493e89/attachment-0001.bin>
Подробная информация о списке рассылки Devel