Простая (небезопасная) хеш-функция для JavaScript?
Возможный дубликат:
Создать хэш из строки в Javascript/jQuery
Может ли кто-нибудь предложить простой (т.е. десятки строк кода, а не сотни строк) хеш-функции, написанной в (совместимом с браузером) JavaScript? В идеале мне бы хотелось, чтобы при передаче строки в качестве ввода вы создавали нечто похожее на шестнадцатеричную строку с 32 символами, что типичный вывод MD5, SHA1 и т.д. Он не должен быть криптографически защищен, просто разумно устойчив к столкновениям, (Мой исходный вариант использования - это URL-адреса, но я, вероятно, захочу использовать его в других строках в будущем.)
Ответы
Ответ 1
Я не проверял это сам, но вы можете посмотреть на это JavaScript-реализация метода Java String.hashCode(). Кажется разумным.
С помощью этого прототипа вы можете просто вызвать .hashCode()
для любой строки, например. "some string".hashCode()
и получить числовой хеш-код (более конкретно, эквивалент Java), такой как 1395333309.
String.prototype.hashCode = function() {
var hash = 0;
if (this.length == 0) {
return hash;
}
for (var i = 0; i < this.length; i++) {
char = this.charCodeAt(i);
hash = ((hash<<5)-hash)+char;
hash = hash & hash; // Convert to 32bit integer
}
return hash;
}
Ответ 2
Проверьте эти реализации
Ответ 3
Существует много реализаций хэш-функций, написанных в JS. Например:
Если вам не нужна безопасность, вы также можете использовать base64, который не является хэш-функцией, не имеет фиксированного вывода и может быть просто декодирован пользователем, но выглядит более легким и может использоваться для скрытых значений: http://www.webtoolkit.info/javascript-base64.html
Ответ 4
Эта статья подробно описывает простые хеш-функции и предоставляет некоторый пример кода (на C), который довольно неудобен. Похоже, функция хэша Боба Дженкинса может быть подходящей для ваших нужд (это Dr В статье Dobbs содержится более подробная информация и обзор других хеш-функций, оба из которых могут быть полезными).
Ответ 5
Ознакомьтесь с этой MD5-реализацией для JavaScript. Его BSD лицензирован и очень прост в использовании. Пример:
md5 = hex_md5("message to digest")
Ответ 6
Простой хешер объекта:
(function () {
Number.prototype.toHex = function () {
var ret = ((this<0?0x8:0)+((this >> 28) & 0x7)).toString(16) + (this & 0xfffffff).toString(16);
while (ret.length < 8) ret = '0'+ret;
return ret;
};
Object.hashCode = function hashCode(o, l) {
l = l || 2;
var i, c, r = [];
for (i=0; i<l; i++)
r.push(i*268803292);
function stringify(o) {
var i,r;
if (o === null) return 'n';
if (o === true) return 't';
if (o === false) return 'f';
if (o instanceof Date) return 'd:'+(0+o);
i=typeof o;
if (i === 'string') return 's:'+o.replace(/([\\\\;])/g,'\\$1');
if (i === 'number') return 'n:'+o;
if (o instanceof Function) return 'm:'+o.toString().replace(/([\\\\;])/g,'\\$1');
if (o instanceof Array) {
r=[];
for (i=0; i<o.length; i++)
r.push(stringify(o[i]));
return 'a:'+r.join(';');
}
r=[];
for (i in o) {
r.push(i+':'+stringify(o[i]))
}
return 'o:'+r.join(';');
}
o = stringify(o);
for (i=0; i<o.length; i++) {
for (c=0; c<r.length; c++) {
r[c] = (r[c] << 13)-(r[c] >> 19);
r[c] += o.charCodeAt(i) << (r[c] % 24);
r[c] = r[c] & r[c];
}
}
for (i=0; i<r.length; i++) {
r[i] = r[i].toHex();
}
return r.join('');
}
}());
Мяч здесь - строка, который просто преобразует любой объект в уникальную строку. hashCode затем пробегает объект, смешивая символы стробируемого объекта.
Для дополнительных точек экспортируйте стриппер и создайте парсер.
Ответ 7
// Simple but unreliable function to create string hash by Sergey.Shuchkin [t] gmail.com
// alert( strhash('http://www.w3schools.com/js/default.asp') ); // 6mn6tf7st333r2q4o134o58888888888
function strhash( str ) {
if (str.length % 32 > 0) str += Array(33 - str.length % 32).join("z");
var hash = '', bytes = [], i = j = k = a = 0, dict = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','1','2','3','4','5','6','7','8','9'];
for (i = 0; i < str.length; i++ ) {
ch = str.charCodeAt(i);
bytes[j++] = (ch < 127) ? ch & 0xFF : 127;
}
var chunk_len = Math.ceil(bytes.length / 32);
for (i=0; i<bytes.length; i++) {
j += bytes[i];
k++;
if ((k == chunk_len) || (i == bytes.length-1)) {
a = Math.floor( j / k );
if (a < 32)
hash += '0';
else if (a > 126)
hash += 'z';
else
hash += dict[ Math.floor( (a-32) / 2.76) ];
j = k = 0;
}
}
return hash;
}