2013-11-07 2 views
-1

Я начал с this bizarre scenario, после чего кто-то указал, что на самом деле я получаю правильный хеш, но кодировка входной строки была чем-то неправильным ,Различные значения, когда я запускаю строку через SHA1, чем когда я проверяю ее с помощью .charCodeAt()

Итак, я углубился глубже. У меня есть эта строка s в моей Node.js VM. РЕПЛ:

> s 
':"? O' 
> s.charAt(2) 
'?' 
> s.charCodeAt(2) 
10047 
> var c = s.charAt(2) 
> c.charCodeAt() 
10047 

От одного этого, я предположил бы, что нет ничего плохого в том самом, так что мой терминал, имеющий проблемы с отображением его (cmd.exe на Windows XP) строки.

Однако, посмотрите на мою функцию SHA1 и что происходит, когда я пытаюсь применить его:

function SHA1(m){ 
    var h = crypto.createHash('sha1'); 
    h.update(m); 
    return h.digest('hex'); 
} 

> SHA1(c) 
'5bab61eb53176449e25c2c82f172b82cb13ffb9d' 

Интересно, что даже если я построить его вручную из элемент кода, это все еще портит его:

> SHA1(String.fromCharCode(10047) 
'5bab61eb53176449e25c2c82f172b82cb13ffb9d' 

> SHA1(String.fromCharCode(63)) 
'5bab61eb53176449e25c2c82f172b82cb13ffb9d' 

This seems to happen in Chrome with Rusha, as well. 

Что здесь происходит?

+1

я получить целый новый 'sha1' хэш, если я передать' .update (String.fromCharCode (100047, «utf8») 'может быть, вы должны попробовать. – Gntem

+1

GeoPhoenix правильно, давая строку«UTF- 8 'необходимо, потому что по умолчанию это буфер. – user568109

+0

'.update (String.fromCharCode (100047),' utf8 ')' получил синтаксическую ошибку при первом комментарии. – Gntem

ответ

0

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

> var h = crypto.createHash('sha1'); 
> h.update(String.fromCharCode(10047),'utf8').digest('hex'); 
'902c43163c965fb0cf4c276f9b660c97a22fb355' 
> var h = crypto.createHash('sha1'); 
> h.update(String.fromCharCode(63),'utf8').digest('hex'); 
'5bab61eb53176449e25c2c82f172b82cb13ffb9d' 
+0

Итак, почему h.update (String.fromCharCode (63)), 'utf8'). digest ('hex'), дать то же самое, что и h.update (String.fromCharCode (63)). digest ('hex');? – user2958725

+0

@ user2958725 Принуждение к буферу дает тот же результат из-за однобайтовый полезный груз. Когда он равен 10047, эквивалентный буфер имеет длину 3 байта. – user568109

+0

Сравните значения буфера: '' vs ''. – user568109

Смежные вопросы