Bash,如何哈希值的字符串?

Zom*_*ies 7 string bash

我想简单地将任意长度的字符串转换为整数值.每个字符串将映射到唯一或甚至非唯一的整数.是否有任何现有的opensource命令执行此操作?

如果它是唯一的奖励点,例如通过bash命令计算字典顺序.

ric*_*ici 13

您需要注意使用hash通用编程语言中的函数.将随机种子引入散列函数是很常见的,因此散列值仅对于单个程序执行是唯一的.这避免了oCert Advisory 2011-3中提到的拒绝服务攻击.(正如该通报所述,该问题于2003年在向Usenix提交的一篇论文中有所描述.)

例如,自v3.3起,Python散列函数默认是随机的:

$ python3 -c 'from sys import argv;print(hash(argv[1]))' abc
-2595772619214671013
$ python3 -c 'from sys import argv;print(hash(argv[1]))' abc
-6001956461950650533
$ python3 -c 'from sys import argv;print(hash(argv[1]))' abc
-7414807274805087300
$ python3 -c 'from sys import argv;print(hash(argv[1]))' abc
-327608370992723225
# Python2 generates consistent hash values
$ python -c 'from sys import argv;print(hash(argv[1]))' abc
1453079729188098211
$ python -c 'from sys import argv;print(hash(argv[1]))' abc
1453079729188098211
$ python -c 'from sys import argv;print(hash(argv[1]))' abc
1453079729188098211
Run Code Online (Sandbox Code Playgroud)

您可以通过设置PYTHONHASHSEED环境变量来控制Python中的哈希随机化.

或者您可以使用标准化的加密哈希,如SHA-1.常用sha1sum实用程序以十六进制输出其结果,但您可以使用bash将其转换为十进制(截断为64位):

$ echo $((0x$(sha1sum <<<"string to hash")0))
-7037254581539467098
Run Code Online (Sandbox Code Playgroud)

或者在其完整的160位荣耀中使用bc(需要以大写形式写入hex):

$ bc <<<ibase=16\;$(sha1sum <<<"string to hash"|tr a-z A-Z)0
861191872165666513280590001082621748432296579238
Run Code Online (Sandbox Code Playgroud)

如果您只需要以16的幂为模的散列值,则可以使用SHA-1总和的前几个字节.(您可以使用任何选择的字节 - 它们都分布均匀 - 但前几个更容易提取):

$ echo $((0x$(sha1sum <<<"string to hash"|cut -c1-2)))
150
Run Code Online (Sandbox Code Playgroud)

注意:正如@gniourf_gniourf在注释中指出的那样,上面并没有真正计算给定字符串的SHA-1校验和,因为bash here-string语法(<<<word)附加了一个换行符word.由于附加了换行符的字符串的校验和与字符串本身的校验和一样好,所以只要您始终使用相同的机制来生成散列就没有问题.


bis*_*hop 10

您可以使用sumcksum命令(后者是首选)来生成基数为10的整数:

$ cksum <<< 'hello world' | cut -f 1 -d ' '
3733384285

$ cksum <<< 'goodbye world' | cut -f 1 -d ' '
2600070097
Run Code Online (Sandbox Code Playgroud)

如果您对这些简单哈希背后的数学感兴趣,请查看源实现: