如何将 SHA1 哈希字符串截断为 32 位字符串

How to truncate a SHA1 hashed string into a 32 bit string

我想创建一个可用作加密密钥的 32 位字符串。这个string/key应该是从一个纯文本字符串派生出来的,例如:

'I am a string'

我的方法首先是散列它:

hashed_string = Digest::SHA1.hexdigest('I am a string') # => 'bd82fb0e81ee9f15f5929e0564093bc9f8015f1d'

然后只使用前 32 个字符:

hashed_string[0..31] # => 'bd82fb0e81ee9f15f5929e0564093bc9'

但是,我觉得一定有更好的方法,我不确定我是否冒着 2 个输入字符串产生相似键的风险。

什么是更好的方法?我看到 this post 涉及截断,但在那里找不到吸引我的答案。

如果您想要一个 32 位的字符串(弱)密码:

Digest::SHA1.digest('I am a string').unpack('B32').first
#=> "10111101100000101111101100001110"

同样的信息量也可以用8个十六进制数显示:

Digest::SHA1.hexdigest('I am a string')[0,8]
#=> "bd82fb0e"

或 4 个 ascii 字符:

Digest::SHA1.digest('I am a string')[0,4]
#=> "\xBD\x82\xFB\x0E"