How to hash javascript

How to create a hash from a string in JavaScript?

Before we start, let’s understand the hash in JavaScript. The hash is also a string, but it’s encrypted using a particular algorithm. Generally, we use the hash for security purposes.

For example, Google stores users’ emails and passwords in their database. Now, Google’s employees can access their database for development purposes. But can they get the user’s email and password from the database? No, because the password is stored in the hash form, and to decrypt the password, the employee needs the key which we used while creating the hash from the password string.

So, in such a way, we can convert the data to hash format. Whenever we require to compare the original data with new data, we can convert new data to hash using the same algorithm and compare it with the original data’s hash. We will learn to create a hash from a string in JavaScript.

Create an algorithm to convert string to hash

In this approach, we will create a custom function to generate a hash from the string. We will use the ASCII value of every string character, perform some operations such as multiplication, addition, subtraction, OR, etc., and generate a hash from that.

Syntax

Users can follow the syntax below to generate a hash from the string.

In the above syntax, hashstring contains the final hash of the str string.

Algorithm

  • Step 1 − Initialize the hashString variable with zero.
  • Step 2 − Use the for-of loop to iterate through the string.
  • Step 3 − Inside the for-of loop, get the ASCII value for every character.
  • Step 4 − After that, left shift the hashString by 5 to multiply it with 31, and subtract the hashString from it.
  • Step 5 − Add the ASCII value of the string character to the hashString variable.
  • Step 6 − Perform an OR operation of the hashString variable value with itself.
  • Step 7 − Once all iterations of the for-loop are completed, we can get the final hash of a 32-bit integer.

Example 1

We have taken the different strings to generate their hash in the example below. We have created the convertToHash() function, which takes the string as a parameter, and implements the above algorithm to convert it to the hash.

Читайте также:  Earth 2 java мод

Users can observe the 32-bit integer value representing the hash in the output. Also, we can observe that it will always generate the same hash for the same string.

  

Creating the custom hash function to convert string to hash

Example 2

In the example below, we have implemented the above algorithm to convert the string to the hash, but we have used the reduce method rather than the for-loop. We have used the split() method to convert the string to a character array.

After that, we used the reduce() method and passed the callback function as the first parameter and 0 as a second parameter representing the initial value of the hash variable. In the callback function, we generate the hash using every character’s ASCII value.

  

Using the reduce() method to convert string to hash

Use the crypto-js NPM package

The Crpyo-js is an Npm package that contains various methods to generate a hash from the string. It also contains some algorithms to decrypt the messages.

Users need to install the crypto-js npm package into the node project using the below command.

Syntax

Users can follow the syntax below to import and use the crypto-js package for encryption and decryption.

var ciphertext = CryptoJS.AES.encrypt('string', 'secret key').toString();

In the above syntax, we have used the encrypt() method of the AES module of the cryptoJS package.

Parameters

  • String − It is a message or data in the string format to generate a hash.
  • Secret key is a secret key that the algorithm will use while generating the hash. As complex as the hash, it will generate more secure encrypted text.

Example 3

We have imported the crypto-js package in the NodeJs file in the example below. After that, we accessed the AES module of the CryptoJs and used the encrypt() method to generate a hash from the string.

Users can observe the hash generated using the AES algorithm in the output.

var CryptoJS = require("crypto-js"); // Encrypt var encryptedText = CryptoJS.AES.encrypt('Your Welcome!', 'This is my Secret').toString(); console.log("The hash string is " + encryptedText);

Output

«The hash string is U2FsdGVkX19br0LjrHteC9+dlP2PS9dVT03IrTc9zwQ clear»>

Источник

How to hash javascript

Хеширование

Чтобы превратить ключ ассоциативного массива в индекс обычного, нужно проделать 2 операции:

То есть конечная задача – преобразовать ключ в числовой индекс, но она обычно выполняется в два этапа.

Вычисление хеша

Хеш-функция получает входные данные и преобразует их в хеш – строку или число фиксированной длины. Вы точно слышали о некоторых алгоритмах хеширования: CRC32 , MD5 и SHA . Ключ при этом может быть представлен любым типом данных, с которым умеет работать хеш-функция.

Пример хеша – идентификатор коммита в git. Когда вы сохраняете изменения, они хешируются и получается что-то вроде 0481e0692e2501192d67d7da506c6e70ba41e913 . Это хеш, вычисленный для ваших изменений.

Читайте также:  Html iframe frameborder 0 allowfullscreen iframe

Реализация хеш-функции может быть самой разной. Например, можно использовать самую простую функцию идентичности, которая принимает входной параметр и возвращает его без изменений:

☕ Распространенные алгоритмы и структуры данных в JavaScript: объекты и хеширование

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

Такая реализация позволяет с легкостью удалять элементы из таблицы, ведь в связном списке операция удаления занимает константное время.

Реализация хеш-таблицы на JavaScript

Хеш-таблица должна реализовывать интерфейс ассоциативного массива, то есть предоставлять три основных метода:

  • добавление новой пары ключ-значение;
  • поиск значения по ключу;
  • удаление пары по ключу.

Чем меньше размер хеш-таблицы (длина массива), тем чаще будут происходить коллизии. Мы возьмем для примера небольшое число – 32. На практике для размера хеш-таблицы часто используются простые числа (которые делятся только на единицу и на себя). Считается, что при этом возникает меньше коллизий.

Для разрешения коллизий будем использовать метод цепочек. Для этого нам потребуется класс связного списка LinkedList , который мы реализовывали во второй статье цикла.

const hashTableSize = 32; class HashTable < constructor() < this.buckets = Array(hashTableSize).fill(null); >hash(key) < let hash = Array.from(key).reduce((sum, key) =>< return sum + key.charCodeAt(0); >, 0); return hash % hashTableSize; > set(key, value) < // вычисляем хеш для ключа let index = this.hash(key); // если для данного хеша еще нет списка, создаем if (!this.buckets[index]) < this.buckets[index] = new LinkedList(); >let list = this.buckets[index]; // проверяем, не добавлен ли ключ ранее let node = list.find((nodeValue) => < nodeValue.key === key; >); if (node) < node.value.value = value; // обновляем значение для ключа >else < list.append(< key, value >); // добавляем новый элемент в конец списка > > get(key) < // вычисляем хеш для ключа let index = this.hash(key); // находим в массиве соответствующий список let list = this.buckets[index]; if (!list) return undefined; // ищем в списке элемент с нужным ключом let node = list.find((nodeValue) =>< return nodeValue.key === key; >); if (node) return node.value.value; return undefined; > delete(key) < let index = this.hash(key); let list = this.buckets[index]; if (!list) return; let node = list.find((nodeValue) =>nodeValue.key === key); if (!node) return; list.delete(node.value); > > 

Эффективность основных операций в хеш-таблице

Основные операции в хеш-таблице состоят из двух этапов:

  • вычисление хеша для ключа и проверка элемента, соответствующего этому хешу в итоговом массиве.
  • перебор других элементов, если нужный не нашелся сразу.

Первый этап всегда занимает константное время, второй – линейное, то есть зависит от количества элементов, которые нужно перебрать.

Эффективность хеш-таблицы зависит от трех основных факторов:

  • Хеш-функция, которая вычисляет индексы для ключей. В идеале она должна распределять индексы равномерно по массиву;
  • Размер самой таблицы – чем он больше, тем меньше коллизий;
  • Метод разрешения коллизий. Например, метод цепочек позволяет свести операцию добавления нового элемента к константному времени.

В конечном итоге, чем меньше коллизий, тем эффективнее работает таблица, так как не требуется перебирать много элементов, если искомый не нашелся сразу по хешу. В целом, эффективность хеш-таблицы выше, чем у других структур данных.

Читайте также:  Python tkinter button relief

Использование хеш-таблиц

Хеш-таблицы широко используются в программировании, например, для механизмов авторизации, индексации больших объемов информации (баз данных), кеширования или поиска. Еще один распространенный кейс – реализация неупорядоченных множеств, о которых мы поговорим в следующей части цикла.

В JavaScript хеш-таблицы в чистом виде используются довольно редко. Обычно всю их работу успешно выполняют обычные объекты (ассоциативные массивы) или более сложные Map. При этом на более низком уровне(интерпретация программы) для представления объектов как раз используются хеш-таблицы.

Объекты и хеш-таблицы часто используются в качестве вспомогательных структур при оптимизации различных действий. Например, для подсчета количества вхождений разных символов в строку.

function countSymbols(string) < const hash = <>; [. string].forEach(s => < let symbol = s.toLowerCase(); if (!(symbol in hash)) hash[symbol] = 0; hash[symbol]++; >); return hash; > countSymbols('Hello, world!'); /* < " ": 1, "!": 1, ",": 1, d: 1, e: 1, h: 1, l: 3, o: 2, r: 1, w: 1 >*/ 

Хеширование, кодирование и шифрование

Хеширование – это алгоритм, работающий только в одну сторону. Из хеша невозможно получить исходное значение – да и практической необходимости в этом нет, ведь главная задача хеширования – различать входные данные, а не сохранять их.

В ряде случаев нам требуется двустороннее преобразование. Например, вы хотите оставить другу секретное сообщение, которое никто, кроме него, не сможет прочесть. Тут на помощь приходят алгоритмы шифрования .

Вы преобразуете исходный текст в какую-то другую последовательность символов с помощью шифра. Такая последовательность либо абсолютно нечитаема (просто набор букв), либо имеет совершенно другой смысл. Если кто-нибудь перехватит это письмо, то просто не поймет, что вы хотели сказать. Ваш друг знает, что послание зашифровано, и знает, как его расшифровать. Таким образом, главная цель шифрования – скрыть информацию от посторонних лиц. Для этого используется секретный ключ или даже два ключа – один для шифрования, второй для расшифровки.

Кроме шифрования есть еще кодирование. Оно близко к шифрованию по сути, но отличается по цели. Кодирование используется для упрощения передачи информации, например, по линиям электросвязи. Ваше сообщение преобразуется в последовательность битов, доставляется получателю по проводу, а на том конце снова восстанавливается. Никакие ключи при этом не используются. Подобные коды не только решают проблему коммуникации, но и часто пытаются бороться с возможными помехами при передаче, то есть обладают способностью восстанавливать повреждения. Один из самых известных кодов – азбука Морзе.

Заключение

Разбираясь с хеш-таблицами, мы в очередной раз убедились, что практически все в программировании делается через… массивы. Вот и ассоциативные объекты под капотом тоже их используют, вычисляя индекс для каждого ключа с помощью хеш-функций.

В последней статье цикла мы разберем еще несколько полезных прикладных алгоритмов для веб-разработки.

Источник

Оцените статью