Skip to content

Commit 6451163

Browse files
committed
инициализация хешей для пустых данных; тесты добавлены и исправлены
1 parent 0217082 commit 6451163

3 files changed

Lines changed: 209 additions & 73 deletions

File tree

src/OneScript.StandardLibrary/Hash/HashImpl.cs

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,21 @@ public class HashImpl : AutoContext<HashImpl>
2626
private readonly Crc32 _crc32;
2727
private readonly IncrementalHash _provider;
2828
private readonly HashFunctionEnum _enumValue;
29-
private bool _calculated;
3029
private byte[] _hash;
3130

3231
public HashImpl(IncrementalHash provider, HashFunctionEnum enumValue)
3332
{
3433
_provider = provider;
3534
_enumValue = enumValue;
36-
_calculated = false;
3735
if (enumValue == HashFunctionEnum.CRC32)
3836
{
3937
_crc32 = new Crc32();
4038
}
4139
else ArgumentNullException.ThrowIfNull(provider);
42-
}
43-
40+
41+
AppendData(Array.Empty<byte>());
42+
}
43+
4444
[ContextProperty("ХешФункция", "HashFunction")]
4545
public HashFunctionEnum Extension => _enumValue;
4646

@@ -49,9 +49,6 @@ public IValue Hash
4949
{
5050
get
5151
{
52-
if(!_calculated)
53-
return ValueFactory.Create(0);
54-
5552
if (_crc32 != null)
5653
return ValueFactory.Create(_crc32.GetCurrentHashAsUInt32());
5754

@@ -64,9 +61,6 @@ public string HashString
6461
{
6562
get
6663
{
67-
if (!_calculated)
68-
return "0";
69-
7064
if (_crc32 != null)
7165
return _crc32.GetCurrentHashAsUInt32().ToString("X8");
7266

@@ -93,8 +87,6 @@ private void AppendData(byte[] data, int count)
9387
_provider.AppendData(data,0,count);
9488
_hash = _provider.GetCurrentHash();
9589
}
96-
97-
_calculated = true;
9890
}
9991

10092
private void AppendStream(Stream stream)
@@ -155,8 +147,11 @@ public void AppendFile(string path)
155147
if (!File.Exists(path))
156148
throw RuntimeException.InvalidArgumentType();
157149

158-
using var stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
159-
AppendStream(stream);
150+
using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
151+
{
152+
AppendStream(stream);
153+
stream.Close();
154+
}
160155
}
161156

162157
[ScriptConstructor(Name = "По указанной хеш-функции")]

tests/datahashing-from-stream.os

Lines changed: 98 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,98 @@
1-
Перем юТест;
2-
3-
Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт
4-
5-
юТест = ЮнитТестирование;
6-
7-
ВсеТесты = Новый Массив;
8-
ВсеТесты.Добавить("ТестДолжен_ПроверитьХешированниеДанныхИзПотокаВПамяти");
9-
10-
Возврат ВсеТесты;
11-
12-
КонецФункции
13-
14-
Функция ТестДолжен_ПроверитьХешированниеДанныхИзПотокаВПамяти() Экспорт
15-
16-
БДД = ПолучитьБуферДвоичныхДанныхИзHexСтроки("313233");
17-
Поток = Новый ПотокВПамяти();
18-
Структура = Новый Структура("Поток", Поток);
19-
Поток.Записать(БДД, 0, 3);
20-
Поток.Перейти(0,ПозицияВПотоке.Начало);
21-
ХД = Новый ХешированиеДанных(ХешФункция.MD5);
22-
ХД.Добавить(Поток);
23-
юТест.ПроверитьРавенство(Строка(ХД.ХешСумма),
24-
"20 2C B9 62 AC 59 07 5B 96 4B 07 15 2D 23 4B 70",
25-
"Не получен ожидаемый hash - 20 2C B9 62 AC 59 07 5B 96 4B 07 15 2D 23 4B 70"
26-
+ "Получен hash - " + Строка(ХД.ХешСумма) );
27-
28-
29-
ДвоичныеДанные = ПолучитьДвоичныеДанныеИзHexСтроки("1b1e c416 6a11 c03b 3afe faea 442e 7709");
30-
Поток = ДвоичныеДанные.ОткрытьПотокДляЧтения();
31-
32-
ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
33-
ЗаписьТекста = Новый ЗаписьТекста(ИмяВременногоФайла);
34-
ЗаписьТекста.ЗаписатьСтроку("1b1e c416 6a11 c03b 3afe faea 442e 7709");
35-
ЗаписьТекста.Закрыть();
36-
37-
ФайловыйПоток = Новый ФайловыйПоток(ИмяВременногоФайла, РежимОткрытияФайла.Открыть);
38-
39-
Хеширование = Новый ХешированиеДанных(ХешФункция.SHA256);
40-
Хеширование.Добавить(Поток, 2);
41-
юТест.ПроверитьРавенство("0b427acd4088d248408e38b34fb378172a05bd71e58b384f5b279beea7aea467"
42-
, НРег(ПолучитьHexСтрокуИзДвоичныхДанных(Хеширование.ХешСумма)));
43-
44-
Хеширование.Добавить(Поток, 12);
45-
юТест.ПроверитьРавенство("2a0815b87888a03406d7ab482b965361eb96112db88e8ab6ea214cb107ee8469"
46-
, НРег(ПолучитьHexСтрокуИзДвоичныхДанных(Хеширование.ХешСумма)));
47-
48-
Хеширование.Добавить(ФайловыйПоток, 2);
49-
юТест.ПроверитьРавенство("8f0ae87f4e7fa52ed08127867a7430003b312ca3777319a533ae417daa6255cc"
50-
, НРег(ПолучитьHexСтрокуИзДвоичныхДанных(Хеширование.ХешСумма)));
51-
52-
Хеширование.Добавить(ФайловыйПоток, 12);
53-
юТест.ПроверитьРавенство("4ec0ce7ec4e12c6e8922f5f1c28a582557e88731a32845a0429cda74ee7fa649"
54-
, НРег(ПолучитьHexСтрокуИзДвоичныхДанных(Хеширование.ХешСумма)));
55-
56-
57-
58-
КонецФункции
1+
Перем юТест;
2+
3+
Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт
4+
5+
юТест = ЮнитТестирование;
6+
7+
ВсеТесты = Новый Массив;
8+
ВсеТесты.Добавить("ТестДолжен_ПроверитьХешированниеДанныхИзПотокаВПамяти");
9+
ВсеТесты.Добавить("ТестДолжен_ПроверитьХешированниеДанныхИзФайловогоПотока");
10+
ВсеТесты.Добавить("ТестДолжен_ПроверитьХешированниеДанныхИзРазныхПотоков");
11+
12+
Возврат ВсеТесты;
13+
14+
КонецФункции
15+
16+
Процедура ТестДолжен_ПроверитьХешированниеДанныхИзПотокаВПамяти() Экспорт
17+
18+
БДД = ПолучитьБуферДвоичныхДанныхИзHexСтроки("313233");
19+
Поток = Новый ПотокВПамяти();
20+
Поток.Записать(БДД, 0, 3);
21+
Поток.Перейти(0,ПозицияВПотоке.Начало);
22+
ХД = Новый ХешированиеДанных(ХешФункция.MD5);
23+
ХД.Добавить(Поток);
24+
юТест.ПроверитьРавенство(Строка(ХД.ХешСумма),
25+
"20 2C B9 62 AC 59 07 5B 96 4B 07 15 2D 23 4B 70",
26+
"Не получен ожидаемый hash - 20 2C B9 62 AC 59 07 5B 96 4B 07 15 2D 23 4B 70"
27+
+ "Получен hash - " + Строка(ХД.ХешСумма) );
28+
29+
30+
ДвоичныеДанные = ПолучитьДвоичныеДанныеИзHexСтроки("1b1e c416 6a11 c03b 3afe faea 442e 7709");
31+
Поток = ДвоичныеДанные.ОткрытьПотокДляЧтения();
32+
33+
34+
Хеширование = Новый ХешированиеДанных(ХешФункция.SHA256);
35+
Хеширование.Добавить(Поток, 2);
36+
юТест.ПроверитьРавенство("0b427acd4088d248408e38b34fb378172a05bd71e58b384f5b279beea7aea467"
37+
, НРег(ПолучитьHexСтрокуИзДвоичныхДанных(Хеширование.ХешСумма)));
38+
39+
Хеширование.Добавить(Поток, 12);
40+
юТест.ПроверитьРавенство("2a0815b87888a03406d7ab482b965361eb96112db88e8ab6ea214cb107ee8469"
41+
, НРег(ПолучитьHexСтрокуИзДвоичныхДанных(Хеширование.ХешСумма)));
42+
43+
КонецПроцедуры
44+
45+
Процедура ТестДолжен_ПроверитьХешированниеДанныхИзФайловогоПотока() Экспорт
46+
47+
ИмяВременногоФайла = юТест.ИмяВременногоФайла();
48+
ЗаписьТекста = Новый ЗаписьТекста(ИмяВременногоФайла);
49+
ЗаписьТекста.ЗаписатьСтроку("1b1e c416 6a11 c03b 3afe faea 442e 7709");
50+
ЗаписьТекста.Закрыть();
51+
52+
ФайловыйПоток = Новый ФайловыйПоток(ИмяВременногоФайла, РежимОткрытияФайла.Открыть);
53+
54+
Хеширование = Новый ХешированиеДанных(ХешФункция.SHA256);
55+
56+
Хеширование.Добавить(ФайловыйПоток, 2);
57+
юТест.ПроверитьРавенство("f257f0501a5e137710e26f1c35ddd32ce2b5752f20274a648cb6d0347849a5a9"
58+
, НРег(ПолучитьHexСтрокуИзДвоичныхДанных(Хеширование.ХешСумма)));
59+
60+
Хеширование.Добавить(ФайловыйПоток, 12);
61+
Сообщить(Хеширование.ХешСуммаСтрокой);
62+
юТест.ПроверитьРавенство("3bc6abfa41bb73c8bcc4c0f5f4d4db42f10f38295a0432afc592fe998465cb9a"
63+
, НРег(ПолучитьHexСтрокуИзДвоичныхДанных(Хеширование.ХешСумма)));
64+
65+
ФайловыйПоток.Закрыть();
66+
КонецПроцедуры
67+
68+
Процедура ТестДолжен_ПроверитьХешированниеДанныхИзРазныхПотоков() Экспорт
69+
70+
ДвоичныеДанные = ПолучитьДвоичныеДанныеИзHexСтроки("1b1e c416 6a11 c03b 3afe faea 442e 7709");
71+
Поток = ДвоичныеДанные.ОткрытьПотокДляЧтения();
72+
73+
ИмяВременногоФайла = юТест.ИмяВременногоФайла();
74+
ЗаписьТекста = Новый ЗаписьТекста(ИмяВременногоФайла);
75+
ЗаписьТекста.ЗаписатьСтроку("1b1e c416 6a11 c03b 3afe faea 442e 7709");
76+
ЗаписьТекста.Закрыть();
77+
78+
ФайловыйПоток = Новый ФайловыйПоток(ИмяВременногоФайла, РежимОткрытияФайла.Открыть);
79+
80+
Хеширование = Новый ХешированиеДанных(ХешФункция.SHA256);
81+
Хеширование.Добавить(Поток, 2);
82+
юТест.ПроверитьРавенство("0b427acd4088d248408e38b34fb378172a05bd71e58b384f5b279beea7aea467"
83+
, НРег(ПолучитьHexСтрокуИзДвоичныхДанных(Хеширование.ХешСумма)));
84+
85+
Хеширование.Добавить(Поток, 12);
86+
юТест.ПроверитьРавенство("2a0815b87888a03406d7ab482b965361eb96112db88e8ab6ea214cb107ee8469"
87+
, НРег(ПолучитьHexСтрокуИзДвоичныхДанных(Хеширование.ХешСумма)));
88+
89+
Хеширование.Добавить(ФайловыйПоток, 2);
90+
юТест.ПроверитьРавенство("8f0ae87f4e7fa52ed08127867a7430003b312ca3777319a533ae417daa6255cc"
91+
, НРег(ПолучитьHexСтрокуИзДвоичныхДанных(Хеширование.ХешСумма)));
92+
93+
Хеширование.Добавить(ФайловыйПоток, 12);
94+
юТест.ПроверитьРавенство("4ec0ce7ec4e12c6e8922f5f1c28a582557e88731a32845a0429cda74ee7fa649"
95+
, НРег(ПолучитьHexСтрокуИзДвоичныхДанных(Хеширование.ХешСумма)));
96+
97+
ФайловыйПоток.Закрыть();
98+
КонецПроцедуры

0 commit comments

Comments
 (0)