Я играл с SHA-2-256 в Джулии и заметил, что полученные хэши не следуют равномерному распределению. Мое понимание алгоритмов безопасного хеширования заключается в том, что они должны хорошо аппроксимировать равномерное распределение, поэтому они непредсказуемы.
Вот код Джулии, который я использую:
с использованием BitIntegers, Distributions, HypothesisTests, Random, SHA
функция sha256_rounds()
rounds::Array{Array{UInt8,1}} = Array{Array{UInt8,1}}(undef, 10000) # 10000 выборок
hash::Array{UInt8} = Array{UInt8}(undef, 64) # 64-байтовый массив
для i = 1:10000
hash = sha2_256(string(rand(UInt64), base = 16)) # Случайное число, преобразование в шестнадцатеричную строку, затем начальное число
раунды[i] = хэш
конец
ответные раунды
конец
sha256_str_vals = [join([string(x, base = 16) for x in y]) for y in sha256_rounds()] # Соедините байты вместе в строки
sha256_num_vals_control = [parse(UInt256, x, base = 16) for x in sha256_str_vals] # Получить числовое значение из строк
OneSampleADTest(sha256_num_vals, Uniform()) # Один образец теста Андерсона-Дарлинга
И результат теста:
Один образец теста Андерсона-Дарлинга
--------------------------------
Данные о населении:
интересующий параметр: еще не реализован
значение под h_0: NaN
балльная оценка: NaN
Резюме теста:
результат с достоверностью 95%: отклонить h_0
одностороннее значение p: <1e-7
Подробности:
количество наблюдений: 10000
выборочное среднее значение: 8,73991847621225e75
образец SD: 2.2742656031884893e76
Статистика A²: Inf
Для меня это говорит о том, что полученные хэши не соответствуют равномерному распределению. Я использую тест неправильно, или мой образец неисправен? Спасибо за ваши мысли.