[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