Цитата(jojo @ Dec 4 2017, 14:38)
Я может скобки не так расставил. Что, и в этом случае тоже?
Идея в том, чтобы использовать часть текущего значения хэша для обращения к заранее вычисленному массиву.
На первом проходе массив заполняется хэшами последовательно.
intermediate[0] = SHA512(salt+password)
intermediate[n] = SHA512(intermediate[n-1])
На втором проходе младшие биты последнего хэша используются как адрес в ранее вычисленном массиве:
address0=intermediate[n]&ff.ff
hash0=SHA512(intermediate[address0])
address1=hash0&ff.ff
hash1=SHA512(intermediate[address1]) и т.д.
Примеры того, что вы хотите сделать, я привёл выше.
Если как вы написали - intermediate массив заполнен (4 мбайта еще надо суметь заполнить хорошим хешем), то ваша функция скорее тогда дополнение к изначальной, в принципе неплохая идея.
Но я подумываю сделать немного по другому, особенность DDR памяти в том, что intermediate[n] вычитывается из памяти очень быстро и возможно кешируется, GDDR5X как раз читает куском в 64 байта, т.е. все равно считается достаточно быстро в GPU.
А вот если я сделаю составление аргумента для SHA512 скажем из 1 байта из каждого intermediate элемента...
Т.е. например
start = intermediate[n]&0xffff
i = 0..63 {
arg |= intermediate[(start+i)&0xffff][i] << i; (т.е. первый байт аргумента получаем, из первого 64 байт куска, первый байт в нем и т.д.)
}
и т.д. (возможно есть более аккуратный способ написать это)
И писать таким же образом, модифицируя исходный intermediate, по байту, это заодно вымоет все возможные кеши в типичных архитектурах.