Модуль:Hash: различия между версиями

Материал из Тептар — свободной энциклопедии
Перейти к навигации Перейти к поиску
(Новая страница: «local getArgs = require('Module:Arguments').getArgs local p = {} local function inTable(table, value) for k, v in pairs(table) do if v == value then return...»)
(нет различий)

Версия от 01:02, 19 июня 2020

Предоставляет доступ к функции хеширования Scribunto. Используется, например, в {{sfn}}.

Использование

{{#invoke:Hash|main|строка|алгоритм хеширования}}

Серым показаны необязательные параметры.

алгоритм хеширования по умолчанию — fnv164 (подробнее).

Список доступных алгоритмов хеширования на ноябрь 2017 года (это те же алгоритмы, что доступны в функции hash() PHP 5.4; их список возвращает функция hash_algos()):

<strong class="error"><span class="scribunto-error" id="mw-scribunto-error-0">Ошибка скрипта: Функции «list» не существует.</span></strong>

Примеры

  • {{#invoke:Hash|main|Строка}} → 5e4befd0eef9b1c6
  • {{#invoke:Hash|main|Другая строка}} → 28c485cd54fe4ae3
  • {{#invoke:Hash|main|Строка|crc32}} → 6c7ee3f8
  • {{#invoke:Hash|main|Строка|crc32b}} → b446d853
  • {{#invoke:Hash|main|Строка|md5}} → 68a645142f2a51d88ff468bba38aecb3
  • {{#invoke:Hash|main|Строка|unknown_algorithm}}Алгоритм хеширования unknown_algorithm не поддерживается, или вы неточно указали его имя. Используйте функцию mw.hash.listAlgorithms() для получения списка доступных алгоритмов.
  • {{#invoke:Hash|main}}Не указана строка для хеширования.

Технические детали

Алгоритм fnv164 выбран в качестве алгоритма по умолчанию из соображений быстродействия (см. en:Fowler–Noll–Vo hash function), 64-битная функция используется для уменьшения вероятности коллизий до пренебрежимо малой величины. Возможно, есть лучшая опция — проверяйте.


local getArgs = require('Module:Arguments').getArgs
local p = {}

local function inTable(table, value)
	for k, v in pairs(table) do
		if v == value then
			return true
		end
	end
	return false
end

function p.main(frame)
	local args = getArgs(frame, { frameOnly = true })
	local algorithm
	
	if not args[1] then
		return '<span class="error">Не указана строка для хеширования.</span>'
	end
	if args[2] then
		if not inTable(mw.hash.listAlgorithms(), args[2]) then
			return '<span class="error">Алгоритм хеширования ' .. args[2] .. ' не поддерживается, или вы неточно указали его имя. Используйте функцию <kbd>mw.hash.listAlgorithms()</kbd> для получения списка доступных алгоритмов.</span>'
		end
		algorithm = args[2]
	else
		-- Алгоритм выбран из соображений быстродействия (см. [[:en:Fowler–Noll–Vo hash function]]),
		-- 64-битная функция используется для уменьшения вероятности коллизий до пренебрежимо малой
		-- величины. Возможно, есть лучшая опция — проверяйте.
		algorithm = 'fnv164'
	end
	
	return mw.hash.hashValue(algorithm, args[1])
end

return p