powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / функция hash
25 сообщений из 79, страница 3 из 4
функция hash
    #39163947
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryСперва искусственно ввёл в беседу о хеше GUID, и теперь заявляешь "при чём тут хеш"?

"хэш" - это что, заклинание такое?

WildSeryХеш - это и есть "алгоритм, предполагающий возникновение коллизии".

одно из двух, либо ты "искусственно ввёл в беседу о хеше" какие-то алгоритмы, либо GUID - это просто (также как и любой хэш) ещё один ЧАСТНЫЙ СЛУЧАЙ "алгоритмa, предполагающий возникновение коллизии". И дело именно в коллизиях, а не в волшебных словах "хэш", "MD5" и прочее
...
Рейтинг: 0 / 0
функция hash
    #39163953
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch"хэш" - это что, заклинание такое?
Нет, это точный математический термин.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
функция hash
    #39163959
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

в контекте Unique constraint единственное, что из этого термина важно, это возникновение коллизий.

и random (в том числе GUID), у которого тоже нормально возникновение коллизий, в контексте Unique constraint от хэша отличается только номинально.
...
Рейтинг: 0 / 0
функция hash
    #39163962
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochв контекте Unique constraint единственное, что из этого термина важно, это
возникновение коллизий.
Нет, гораздо важнее однозначное соответствие объекту, чья уникальность контролируется.
Собственно, это, в данном случае, жизненно важная характеристика.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
функция hash
    #39163968
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovоднозначное соответствие объекту

обеспечивается как раз уникальностью поля, будь оно хоть хэшом, хоть целочисленным по генератору, хоть чем угодно вообще, лишь бы уникальным и постоянным для этой строки (в отличии от rdb$key)
...
Рейтинг: 0 / 0
функция hash
    #39163981
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch> лишь бы уникальным и постоянным для этой строки

А "для какой строки" GUID ?

P.S. Может не надо спорить ради спора?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
функция hash
    #39164158
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

Для каждой.

Речь иждет про использование в unique-полях принципиально не-unique значений.
...
Рейтинг: 0 / 0
функция hash
    #39164168
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochРечь иждет про использование в unique-полях принципиально не-unique значений.

Нет, не об этом идёт речь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
функция hash
    #39164268
Фотография Tonal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Siemargl]TonalSiemargl,
Чудо в том, что алгоритм соответствует и дает тот же результат (у меня).

Кстати, у тебя то не совпал результат - должно быть
HASHHASH114 970 874 536 61014 974 901 068 450 - разбирайся где напортачил, не смог правильно скомпилировать 3 строки? =)

После исправления ошибок ( main не может быть void ) и устранения предупреждений в твоём коде, мои результаты соответствуют тестовым:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
#include <stdio.h>
#include <stdint.h>

uint64_t ElfHash ( const unsigned char *s )
{
    //unsigned long   h = 0, high;
    uint64_t   h = 0, high;
    while ( *s )
    {
        h = ( h << 4 ) + *s++;
        if ( (high = h & 0xF0000000) != 0 )
            h ^= high >> 24;
        h &= ~high;
    }
    return h;
}

int main()
{
	const unsigned char arl[] = "АРЛЕТ";
	const unsigned char bal[] = "БАЛЕТ";
	const unsigned char aaa[] = "jdfgsdhfsdfsd 6445dsfsd7fg/*/+bfjsdgf%$^";

	printf("%lu\n", ElfHash(arl));
	printf("%lu\n", ElfHash(bal));
	printf("%lu\n", ElfHash(aaa));
}


Например отсюда
Код: sql
1.
2.
3.
4.
5.
$ g++ -Wall -O3 -o elfhash elfhash.cpp
$ ./elfhash 
228925186
228924466
248446350


Так что с кодом всё в порядке.
А вот с данными вполне возможны различия. Например если сервер работает с utf данными в utf-16, а не в utf-8, как у меня в исходнике. :)
...
Рейтинг: 0 / 0
функция hash
    #39164297
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tonal,

Неверный ответ.
...
Рейтинг: 0 / 0
функция hash
    #39164336
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochWildSeryХеш - это и есть "алгоритм, предполагающий возникновение коллизии".
одно из двух, либо ты "искусственно ввёл в беседу о хеше" какие-то алгоритмы, либо GUID - это просто (также как и любой хэш) ещё один ЧАСТНЫЙ СЛУЧАЙ "алгоритмa, предполагающий возникновение коллизии". И дело именно в коллизиях, а не в волшебных словах "хэш", "MD5" и прочее
Я тебе ещё только один раз отвечу без тега.
Разумеется, не все алгоритмы с коллизиями являются хешами. "А есть Б" не означает "Б есть А", это простейшая математика и/или логика.

Прошу вернуться к теме хешей, и не писать оффтоп.
...
Рейтинг: 0 / 0
функция hash
    #39164341
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TonalПосле исправления ошибок
если делаешь хеш из 32-битного 64-битный, то меняй и константы 0xF0000000 на 0xF000000000000000 и 24 на 56
...
Рейтинг: 0 / 0
функция hash
    #39164414
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrхеш и так 64-битный
Интересные результаты.

1. Хэш в ФБ похоже что 64-битный судя по результату, но
2. Хэш который Elf - и он же Elf64 на самом деле 32-битный
3. Elf это PJW-32
https://en.wikipedia.org/wiki/PJW_hash_function
https://uclibc.org/docs/elf-64-gen.pdf стр.17
4. Если реализовать PJW-64 то результат расходится с ФБ и с ELF. И коллизии на АРЛЕТ БАЛЕТ нет и в 1251.

Как то так.
Я перевел на С#, чтобы не было расхождения в кодировках
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
using System;
using System.Text;

public class ElfHashPrg {


static ulong ElfHash (byte[] s)
{
    ulong   h = 0, high;
    foreach (byte c in s)
    {
        h = ( h << 4 ) + c;
	high = h & 0xF0000000;
        if ( high != 0 )
            h ^= high >> 24;
        h &= ~high;
    }
    return h;
}

static ulong ElfHash64 (byte[] s)
{
    ulong   h = 0, high;
    foreach (byte c in s)
    {
        h = ( h << 8 ) + c;
	high = h & 0xFF00000000000000UL;
        if ( high != 0 )
	{
            h ^= high >> 48;
        h &= ~high;
	}
    }
    return h;
}


public static void Main()
{
	Encoding  enc    = Encoding.UTF8;
//	Encoding  enc    = Encoding.GetEncoding(1251);


	byte[] arl = enc.GetBytes("АРЛЕТ");
	byte[] bal = enc.GetBytes("БАЛЕТ");


	Console.WriteLine(ElfHash(arl));
	Console.WriteLine(ElfHash(bal));

	Console.WriteLine(ElfHash64(arl));
	Console.WriteLine(ElfHash64(bal));

}

}



Ну и наконец статья, что коллизий в ELF слишком много
http://stackoverflow.com/questions/9159851/why-such-a-high-collision-rate-with-my-elf-hash-implementation
...
Рейтинг: 0 / 0
функция hash
    #39164421
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrTonalПосле исправления ошибок
если делаешь хеш из 32-битного 64-битный, то меняй и константы 0xF0000000 на 0xF000000000000000 и 24 на 56

Вот значит, что сделано в ФБ (результат одинаков) и это _неверно_

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
static ulong ElfHash64_FB (byte[] s)
{
    ulong   h = 0, high;
    foreach (byte c in s)
    {
        h = ( h << 4 ) + c;
	high = h & 0xF000000000000000UL;
        if ( high != 0 )
	{
            h ^= high >> 56;
        h &= ~high;
	}
    }
    return h;
}


...
Рейтинг: 0 / 0
функция hash
    #39164443
Фотография Tonal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl,
Таки, по ходу, разобрались, кто "не умеет компилить". :)

Я, чтоб закрыть все вопросы, перегнал приведённый мной исходник в кодировку cp1251, и получил ровно твои результаты:
Код: sql
1.
2.
3.
4.
5.
$ g++ -Wall -O3 -o elfhash elfhash.cpp
$ ./elfhash 
13490210
13490210
248446350


Так что в данной реализации рояль играет именно кодировка, а не мои "кривые ручки". :)
Заменив на реализацию от dimitr получаем для 1251:
Код: sql
1.
2.
3.
4.
5.
$ g++ -Wall -O3 -o elfhash elfhash.cpp
$ ./elfhash 
13490210
13490210
106287840125083790


и для utf-8
Код: sql
1.
2.
3.
14970874536610
14974901068450
106287840125083790


Т. е. для 1251 значения не меняются от реализации.
...
Рейтинг: 0 / 0
функция hash
    #39164449
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemarglи это _неверно_
Это уже совершенно пофиг. Любое изменение этой функции сломает все базы, которые ею
пользовались.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
функция hash
    #39164483
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovSiemarglи это _неверно_
Это уже совершенно пофиг. Любое изменение этой функции сломает все базы, которые ею
пользовались.

С одной, стороны "проблемы негров"

С другой - тройка еще не вышла.

Не зря функция называется evlHash [ EvilHash =)
...
Рейтинг: 0 / 0
функция hash
    #39164509
Фотография Tonal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Н.да. В этих ваших интернетов поразительное разнообразие реализаций этого хеша для 64 бит. И все даёт разные значения на одинаковых данных. :(
Вот есть же стандартизированные варианты. Тот же CRC CRC-64-ISO и CRC-64-ECMA...
Или взять те же гуглянские cityhash или farmhash .
И вопросов о реализации бы не возникало - всегда с тестовыми данными сравнить можно.
...
Рейтинг: 0 / 0
функция hash
    #39164581
Viktor_bs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока вы тут дискутировали, я прогнал запрос по 25млн уникальных записей.
Кто угадает количество коллизий? :)
Делайте ставки господа...

P.S. При этом 64-битная хеш-udf отрабатывает отлично.

Про теоретическую возможность коллизий я не спорю, но алгоритм для функции hash выбран неудачно (имхо)
Кстати, тут выше звучал намек на замену алгоритма в существующей функции, я думаю что разработчики лучше нас понимают что этого делать нельзя.

Если и делать, то добавить новую функцию в 3-ке, например тот-же sha1
...
Рейтинг: 0 / 0
функция hash
    #39164590
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viktor_bs,

Это не алгоритм неудачный, это из-за ошибки в реализации он работает чуть лучше чем 32-битный (и то не доказано). Причем чем короче ключ - тем больше % коллизий.
...
Рейтинг: 0 / 0
функция hash
    #39164599
Viktor_bs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglViktor_bs,

Это не алгоритм неудачный, это из-за ошибки в реализации он работает чуть лучше чем 32-битный (и то не доказано). Причем чем короче ключ - тем больше % коллизий.
Та я уже перечитал вашу переписку и понял.
на 15млн записей - 4560 коллизий. Максимальное количество 8, там помимо текста еще и цифры (размерность).
...
Рейтинг: 0 / 0
функция hash
    #39164619
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viktor_bsSiemarglViktor_bs,

Это не алгоритм неудачный, это из-за ошибки в реализации он работает чуть лучше чем 32-битный (и то не доказано). Причем чем короче ключ - тем больше % коллизий.
Та я уже перечитал вашу переписку и понял.
на 15млн записей - 4560 коллизий. Максимальное количество 8, там помимо текста еще и цифры (размерность).
Это достаточно мало, даже лучше чем в статье. Да и на коротких данных применять хэш невыгодно - дольше раз в несколько чем прямое сравнение.
...
Рейтинг: 0 / 0
функция hash
    #39165278
_Док_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Viktor_bsЕсли и делать, то добавить новую функцию в 3-ке, например тот-же sha1
тоже давно об этом думаю мечтаю ...
...
Рейтинг: 0 / 0
функция hash
    #39165313
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Док_Viktor_bsЕсли и делать, то добавить новую функцию в 3-ке, например тот-же sha1
тоже давно об этом думаю мечтаю ...

дык в чём проблема сделай и отошли патч. Время ещё есть.
Одному товарищу захотелось вкрутить статистические функции. Он их сделал, отослал патч и в результате они попали в Firebird 3.
...
Рейтинг: 0 / 0
функция hash
    #39165324
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

в 3.0 ? там разве не feature freeze уже полгода как ?

вот в 3.1 тогда будет наверное
...
Рейтинг: 0 / 0
25 сообщений из 79, страница 3 из 4
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / функция hash
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]