如何从字符串生成唯一的十六进制哈希值?

如何从字符串生成唯一的十六进制哈希值?

是否可以从 LaTeX 中的字符串生成唯一的十六进制哈希值?它不必是加密的,因此是否可逆并不重要。例如:

input: 2018013001
output: 78486F49

解释一下我的用例:我想为我的发票生成一个唯一标识符。它应该由包含实际日期和数字的字符串生成。

答案1

您有binhex纯 TeX 宏包,或者用于该宏的xintbinhex包(来自xint包)。我使用随附的 nbaseprt包完成了该任务,numprint用于格式化数字的十六进制表示。

命令\Hexadecimalnumfromfmtcount应该是第三种可能性——不幸的是,它不适用于这么大的数字,并且只产生一个四个十六进制数。但是,对于您的发票,它可能没问题,因为它最多可以处理 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}

在此处输入图片描述

相关内容