Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.02.2020, 11:27
Новичок на форуме
Отправить личное сообщение для dacbkbq3 Посмотреть профиль Найти все сообщения от dacbkbq3
 
Регистрация: 25.02.2020
Сообщений: 9

Помогите со скриптом! Пожалуйста!
Здравствуйте, извините если не в тот раздел задал вопрос, но помогите пожалуйста со скриптом

Скрипт должен делать 16-ричный хеш-код из текста таким образом: сначала он в функции toWeight() по очереди проходит по всем буквам текста, берёт их номер по алфавиту, и суммирует их номера, например из слова "хеш" он должен сделать число 51 , умножить его на любое большое число, а потом найти остаток от деления, например на текущую дату. и в итоге получается (51 * 999999999) % 25022020 = 5123189, а потом после прохода по функции ToStr() оно преобразуется в 16-ричный вид = 4e2c75

var txt = "АБВ";

function toWeight(inp,a){ // функция принемает на вход текст (inp) и просто переменную равную 0 (a)
	// я знаю что переменную можно объявить и здесь, но тогда вообще ничего не работает...
	this.inp = inp.toUpperCase();
	this.len = this.inp.length;
	this.a = a;

	let abc = [[" ","А","Б","В","Г","Д","Е","Ж","З","И","К","Л","М","Н","О","П","Р","С","Т","У","Ф","Х","Ц","Ч","Ш","Щ","Ъ","Ы","Ь","Э","Ю","Я"],
			   [ 0 , 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]];


	for(var i = 0; i < len; i ++){
		for(var j = 0; j < 31; j++){
			if (this.inp[i] == abc[0][j]){
				this.a += abc[1][j];
			}
		}
	}
	var ret = (this.a * 999999999) % 25022020;
	return ret;
}


// скрипт с этого момента взят из интернта...
var abc="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");

function StrReverse(s){	return s.split("").reverse().join("") }

function ToStr(a,cc){// Аргументы: число, система счисления 
	var s = "";
	var mas = abc.slice(0,cc);
	while(a > 0){//Цикл до тех пор пока A не будет меньше нуля
		s = String(s) + mas[a%cc];//Записываем символ 
		a = Math.floor(a/cc);//Делим без остатка 
	}
	return StrReverse(s);//Выводим результат задом наперед 
}
//теперь опять мой скрипт...

var b = toWeight(txt,51);


var out = ToStr(b,16);
document.write(out);


<!DOCTYPE html>
<html>
<head>
</head>
<body>
	<script src = "learn1.js"></script>
</body>
</html>
Ответить с цитированием
  #2 (permalink)  
Старый 25.02.2020, 11:47
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

dacbkbq3,
поясните для чего это надо.
Сообщение от dacbkbq3
умножить его на любое большое число
из такого подхода достаточно генерировать рандомно
Math.random().toString(16).substr(2)
Ответить с цитированием
  #3 (permalink)  
Старый 25.02.2020, 11:56
Новичок на форуме
Отправить личное сообщение для dacbkbq3 Посмотреть профиль Найти все сообщения от dacbkbq3
 
Регистрация: 25.02.2020
Сообщений: 9

Для того чтобы маленькое число 51 стало огромным например вот таким 50999999949, для последующего деления по модулю на 25022020 и получения в результате 5123189. Рандомное число не подойдет, в случае чего хеш надо чтобы одно и тоже слово вызывало один и тот-же хеш... почитайте про хеш функции в википедии... https://ru.wikipedia.org/wiki/%D0%A5...86%D0%B8%D1%8F
Ответить с цитированием
  #4 (permalink)  
Старый 25.02.2020, 12:01
Новичок на форуме
Отправить личное сообщение для dacbkbq3 Посмотреть профиль Найти все сообщения от dacbkbq3
 
Регистрация: 25.02.2020
Сообщений: 9

Poznakomlus,
Спасибо за помощь, хоть проблема и не пропала, теперь код короче!

var txt = "АБВ";

function toWeight(inp,a){ // функция принемает на вход текст (inp) и просто переменную равную 0 (a)
	// я знаю что переменную можно объявить и здесь, но тогда вообще ничего не работает...
	this.inp = inp.toUpperCase();
	this.len = this.inp.length;
	this.a = a;

	let abc = [[" ","А","Б","В","Г","Д","Е","Ж","З","И","К","Л","М","Н","О","П","Р","С","Т","У","Ф","Х","Ц","Ч","Ш","Щ","Ъ","Ы","Ь","Э","Ю","Я"],
			   [ 0 , 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]];


	for(var i = 0; i < len; i ++){
		for(var j = 0; j < 31; j++){
			if (this.inp[i] == abc[0][j]){
				this.a += abc[1][j];
			}
		}
	}
	var ret = (this.a * 999999999) % 25022020;
	return ret;
}


var b = toWeight(txt,0);


var out = b.toString(16);
document.write(out);
Ответить с цитированием
  #5 (permalink)  
Старый 25.02.2020, 12:07
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

Сообщение от dacbkbq3
Для того чтобы маленькое число 51 стало огромным например вот таким 50999999949
Зачем это надо?
Мало того, что не понимаете о чем говорите так и отсылаете, что сами не читаете
Там же написано коллизии
Для чего вам нужен кеш?
Может вам стоит смотреть на map
Ответить с цитированием
  #6 (permalink)  
Старый 25.02.2020, 12:09
Новичок на форуме
Отправить личное сообщение для dacbkbq3 Посмотреть профиль Найти все сообщения от dacbkbq3
 
Регистрация: 25.02.2020
Сообщений: 9

Хеш мне нужен просто так, цель создать программу работающую с хеш-функцией как вот эта в википедии:

«Хеш-функции», основанные на делении
1. «Хеш-код» как остаток от деления на число всех возможных «хешей»
Хеш-функция может вычислять «хеш» как остаток от деления входных данных на M:


где M — количество всех возможных «хешей» (выходных данных).

При этом очевидно, что при чётном M значение функции будет чётным при чётном k и нечётным — при нечётном k. Также не следует использовать в качестве M степень основания системы счисления компьютера, так как «хеш-код» будет зависеть только от нескольких цифр числа k, расположенных справа, что приведёт к большому количеству коллизий. На практике обычно выбирают простое M; в большинстве случаев этот выбор вполне удовлетворителен.

Последний раз редактировалось dacbkbq3, 25.02.2020 в 12:14.
Ответить с цитированием
  #7 (permalink)  
Старый 25.02.2020, 12:12
Новичок на форуме
Отправить личное сообщение для dacbkbq3 Посмотреть профиль Найти все сообщения от dacbkbq3
 
Регистрация: 25.02.2020
Сообщений: 9

Я знаю что такое коллизии...
Ответить с цитированием
  #8 (permalink)  
Старый 25.02.2020, 12:18
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,745

Не надо использовать this.
Это не конструктор, а обычная функция

var txt = "АБВ";
let abc = [" ","А","Б","В","Г","Д","Е","Ж","З","И","К","Л","М","Н","О","П","Р","С","Т","У","Ф","Х","Ц","Ч","Ш","Щ","Ъ","Ы","Ь","Э","Ю","Я"],
];

function toWeight(inp){

  let a =  [...inp].reduce( (a, sym) => a+Math.max( abc.indexOf(sym.toUperCase() ),0), 0)
	var ret = (a * 999999999) % 25022020;
	return ret;
}


var b = toWeight(txt,0);


var out = b.toString(16);
document.write(out);

Последний раз редактировалось voraa, 25.02.2020 в 12:20.
Ответить с цитированием
  #9 (permalink)  
Старый 25.02.2020, 12:26
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,745

Но у вас слишком большое M. Обычно M, выбирают размером с таблицу, в которой лежат данные.
И от четности М ничего не зависит. Мы же не умножаем на М, а берем остаток от деления.
Возьмите остатки от деления на 4. Это 0,1,2,3. И четные и нечетные
Ответить с цитированием
  #10 (permalink)  
Старый 25.02.2020, 12:31
Новичок на форуме
Отправить личное сообщение для dacbkbq3 Посмотреть профиль Найти все сообщения от dacbkbq3
 
Регистрация: 25.02.2020
Сообщений: 9

Спасибо, но M должно равняться всем возможным вариантам хеша, а если число будет маленьким то будет много коллизий...
https://ru.wikipedia.org/wiki/%D0%9A...86%D0%B8%D0%B8
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите пожалуйста!!! igrovik Общие вопросы Javascript 40 10.04.2018 13:53
Не могу разобраться со скриптом для гугл таблицы. Помогите пожалуйста! sannick Элементы интерфейса 0 17.12.2016 02:29
Помогите, пожалуйста, со скриптом для баннера vladimir003 Общие вопросы Javascript 1 05.08.2016 05:32
Слайдер - карусель блоков (помогите пожалуйста) Viktor.Poberezhniy Общие вопросы Javascript 3 22.07.2014 12:46
Помогите со скриптом, пожалуйста. ScreamSpb777 Элементы интерфейса 1 19.10.2010 17:22