прежде чем запросы выполняются против набора данных, они проведены через оптимизатор запросов, оптимизатор пытается организовать запрос таким способом, что это может удалить столько же кортежей (строки) от набора результатов так быстро, сколько это может. Часто при использовании подзапросов (особенно плохие), кортежи не могут быть сокращены из набора результатов, пока внешний запрос не начинает работать.
С наблюдением запрос его твердое для высказывания, что было так плохо об оригинале, но мое предположение будет им, было чем-то, что оптимизатор просто не мог сделать намного лучше. Выполнение 'объясняет', покажет Вам метод оптимизаторов для получения данных.
Вы можете сделать это менее сложно, используя StringToStream
и тот факт, что FileHash
может принимать входной поток в качестве аргумента. Тогда ваша функция sha1
станет:
sha1[s_String] := Module[{stream = StringToStream[s], hash},
hash = FileHash[stream,"SHA"];
Close[stream];
hash]
Вот работающий кладж. Запишите строку во временный файл и используйте FileHash
:
sha1[s_String] := Module[{stream, file, hash},
stream = OpenWrite[];
WriteString[stream, s];
file = Close[stream];
hash = FileHash[file, "SHA"];
DeleteFile[file];
hash]
Вы также можете определить
hex = IntegerString[#, 16]&;
и вернуть hex @ hash
в приведенной выше функции.