是否可以从 LaTeX 中的字符串生成唯一的十六进制哈希值?它不必是加密的,因此是否可逆并不重要。例如:
input: 2018013001
output: 78486F49
解释一下我的用例:我想为我的发票生成一个唯一标识符。它应该由包含实际日期和数字的字符串生成。
答案1
您有binhex
纯 TeX 宏包,或者用于该宏的xintbinhex
包(来自xint
包)。我使用随附的 nbaseprt
包完成了该任务,numprint
用于格式化数字的十六进制表示。
命令\Hexadecimalnum
fromfmtcount
应该是第三种可能性——不幸的是,它不适用于这么大的数字,并且只产生一个四个十六进制数。但是,对于您的发票,它可能没问题,因为它最多可以处理 16⁵ - 1 = 1048575:
\documentclass{article}
\usepackage{ xintbinhex, nbaseprt}
\input{binhex}
\begin{document}
\begin{tabular}{rclc}
2018013001 & $\rightarrow$ & \leavevmode\hex{2018013001} & \nbaseprint{\hex{2018013001}h}\\[2ex]
& & \xintDecToHex{2018013001}
\end{tabular}
\end{document}
答案2
只需几行代码,您就可以定义一个宏来设置\invoiceid
为数字的十六进制表示形式。
我还展示了另一个使用基数 36 来处理字符串中字母的方法。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\makeinvoiceid}{m}
{
\tl_set:Nx \invoiceid
{
\int_to_Hex:n { #1 }
}
}
\NewDocumentCommand{\makeinvoicelongid}{m}
{
\invoice_add:nnn { #1 } { 1 } { 4 }
\invoice_add:nnn { #1 } { 5 } { 8 }
\invoice_add:nnn { #1 } { 9 } { 12 }
\invoice_add:nnn { #1 } { 13 } { \tl_count:n { #1 } }
}
\tl_new:N \invoicelongid
\cs_new_protected:Nn \invoice_add:nnn
{
\tl_put_right:Nx \invoicelongid
{
\int_to_Hex:n
{
\int_from_base:fn { \tl_range:nnn { #1 } { #2 } { #3 } } { 36 }
}
}
}
\cs_generate_variant:Nn \int_from_base:nn { f }
\ExplSyntaxOff
\begin{document}
\makeinvoiceid{2018013001}
\invoiceid
\makeinvoicelongid{2018013AX001}
\invoicelongid
\end{document}