информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Spanning Tree Protocol: недокументированное применениеАтака на Internet
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Hash function 11.04.03 18:57  
Автор: Nour Статус: Незарегистрированный пользователь
Отредактировано 11.04.03 19:27  Количество правок: 1
<"чистая" ссылка>
Добрый день/вечер/ночь/утро,

Есть задача найти запись в массиве. Массив состоит из пар чисел от 1 до 255, за исключением n-n, причем одна и та же запись должна находиться как по n-m, так и по m-n, следовательно, максимум может быть (255*255-255)/2 = 32385 записей. Например, пары чисел 10-100 и 100-10 должны ссылаться на одну и туже запись в массиве. Я решил использовать для индекса некое подобие hash функции.
(((a+(b-a(b-a))*(a+(b-a)*(b-a)))+((b+(a-b)*(a-b))*(b+(a-b)a-b))))
или такая запись
(a+(b-a)2)2+(b+(a-b)2)2
Жутко громоздко, но работает.
Например, для пар 10-100 и 100-10 индекс будет 133012100.

Для тех, кто понял всю эту галиматью у меня вопрос. Есть ли идеи на счет какого-нибудь менее громоздкого/быстрого решения в целом или hash функции в частности?

Любая помощь/критика приветствуется.
[C++] Можно проще и лучше 11.04.03 20:49  
Автор: leo <Леонид Юрьев> Статус: Elderman
Отредактировано 11.04.03 20:59  Количество правок: 2
<"чистая" ссылка>
length = 255 * 255 - 255;
index = ((~min(a, b) << 8) + max(a, b)) % length;
или
index = ((min(a, b) << 8) - max(a, b)) % length;

Меньше операций и ни одной hash-коллизии.
Удачи.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach