Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Функция хеширования алгоритмом Elf. / 5 сообщений из 5, страница 1 из 1
06.05.2013, 14:20
    #38248977
Fagrant
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция хеширования алгоритмом Elf.
В СУБД FireBird есть функция Hash(), используется алгоритм хеширования Elf, на выходе целое, BIGINT.
Нужна функция на php для генерации подобного хеша, с последующим его сравнением внутри FB.
Есть вот такая, но у нее из-за малой величины используемого типа данных - косяк, правильно работает только на коротких строках, в 5-6 символов:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
function ELFhash($str){ 
	$hash=0;                    
	$x=0; 
	for($i=0; $i < strlen($str); $i++){ 
		$hash = ($hash << 4) + ord($str[$i]); 
		if(($x = $hash & 0xF0000000) != 0){ 
			$hash ^= ($x >> 24); 
		} 
		$hash &=~$x;       
	}        
 return $hash;    
} 



Помогите пожалуйста или доработать эту, или поделитесь готовой :) В PHP не силен, сам не справился...
Для примера, правильный elf-хеш строки 'ChupaTupaCabra!' таков: 719562999816755313
...
Рейтинг: 0 / 0
06.05.2013, 14:32
    #38249010
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция хеширования алгоритмом Elf.
FagrantВ СУБД FireBird есть функция Hash(), используется алгоритм хеширования Elf, на выходе целое, BIGINT.
Нужна функция на php для генерации подобного хеша, с последующим его сравнением внутри FB.
Есть вот такая, но у нее из-за малой величины используемого типа данных - косяк, правильно работает только на коротких строках, в 5-6 символов:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
function ELFhash($str){ 
	$hash=0;                    
	$x=0; 
	for($i=0; $i < strlen($str); $i++){ 
		$hash = ($hash << 4) + ord($str[$i]); 
		if(($x = $hash & 0xF0000000) != 0){ 
			$hash ^= ($x >> 24); 
		} 
		$hash &=~$x;       
	}        
 return $hash;    
} 



Помогите пожалуйста или доработать эту, или поделитесь готовой :) В PHP не силен, сам не справился...
Для примера, правильный elf-хеш строки 'ChupaTupaCabra!' таков: 719562999816755313

Не пинайте, я впервые сталкиваюсь с данным алгоритмом (может из-за того, что не пользую FireBird). Но, что в описании, что в примерах - везде исключающее или предполагается только если $hash & 0xF0000000 != 0. Может в этом ошибка, ведь у Вас данная оперция находится вне ветки с условием.
...
Рейтинг: 0 / 0
06.05.2013, 14:51
    #38249051
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция хеширования алгоритмом Elf.
Fagrant,

Забудьте ) Глупость сказал. код недопонял.
...
Рейтинг: 0 / 0
29.05.2013, 06:16
    #38277738
eJinn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция хеширования алгоритмом Elf.
Fagrant
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
function ELFhash($str){ 
	$hash=0;                    
	$x=0; 
	for($i=0; $i < strlen($str); $i++){ 
		$hash = ($hash << 4) + ord($str[$i]); 
		if(($x = $hash & 0xF000000000000000) != 0){ 
			$hash ^= ($x >> 56); 
		} 
		$hash &=~$x;       
	}        
 return $hash;    
} 



Поправил. Пробуй.
ЗЫ Сам счас проверять буду. Надо в Qt проверять хэш из Firebird.
...
Рейтинг: 0 / 0
29.05.2013, 20:43
    #38279262
eJinn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция хеширования алгоритмом Elf.
Исправил ошибку:
[quot eJinn]Fagrant
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
function ELFhash($str){ 
	$hash=0;                    
	$x=0; 
	for($i=0; $i < strlen($str); $i++){ 
		$hash = ($hash << 4) + ord($str[$i]); 
		if(($x = $hash & 0xF000000000000000) != 0){ 
			$hash ^= ($x >> 56); 
	         	$hash &=~$x;       
		} 
	}        
 return $hash;    
} 
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Функция хеширования алгоритмом Elf. / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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