为什么像sha1这样的散列函数最多只能使用16个不同的char(十六进制)?

dyn*_*mic 5 php encryption sha1

对不起,我有这种好奇心.

sha1使用[a-f0-9] chars作为其散列函数.我可以知道为什么它不会使用所有可能的字符使用所有字符可用[a-z0-9]它可以增加可能的不同哈希的数量,从而降低可能的冲突的可能性.

如果您认为这不是一个真正的问题,请发表评论我会立即删除此问题.

===

正如答案中所述,sha1 NOT仅使用16 chars.正确的事实是:sha1是160位二进制数据(cit.).我添加了这个以防止混淆.

sar*_*old 12

你混淆的表示内容.

sha1 160位二进制数据.你可以很容易地代表它:

hex: 0xf1d2d2f924e986ac86fdf7b36c94bcdf32beec15
decimal: 1380568310619656533693587816107765069100751973397
binary: 1111000111010010110100101111100100100100111010011000011010101100100001101111110111110111101100110110110010010100101111001101111100110010101111101110110000010101
base 62: xufK3qj2bZgDrLA0XN0cLv1jZXc
Run Code Online (Sandbox Code Playgroud)

十六进制并没有什么神奇之处.这是显示内容沿着4位边界轻松破解的非常常见的机制.

base 62输出与红宝石的这一点点发生:

#!/usr/bin/ruby

def chars_from_hex(s)
  c = s % 62
  s = s / 62
  if ( s > 0 )
    chars_from_hex(s)
  end
  if (c < 10)
      print c
  elsif (c < 36)
      print "abcdefghijklmnopqrstuvwxyz"[c-11].chr()
  elsif (c < 62)
      print "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[c-37].chr()
  else
      puts "error c", c
  end
end

chars_from_hex(0xf1d2d2f924e986ac86fdf7b36c94bcdf32beec15)
Run Code Online (Sandbox Code Playgroud)

它使用标准惯用法从一个基础转换为另一个基础,并将其视为0- 0-99,a-z即10-35,A-Z为36-61.通过包括例如!@#$%^&*()-_=+\|[]{},.<>/?;:'"~`是否如此期望,可以简单地扩展以支持更多数字.(或任何大量的Unicode代码点.)

@ yes123具体询问了散列ascii表示,所以这里是将160位散列直接解释为ascii的结果:

ñÒÒù$é¬ý÷³l¼ß2¾ì
Run Code Online (Sandbox Code Playgroud)

看起来并不多,因为:

这种碱基转换也可以实用; 所述的Base64编码方法使用64(代替我的62)字符来表示在时刻6个比特; 它需要两个"数字"字符和一个填充字符.UUEncoding选择了一组不同的"数字".并且堆叠器有一个问题,通过将输入数字的基数更改为输出数字可以轻松解决.