2010-07-29 72 views
1

我设计了一个工具的用户界面,用户需要输入最多300个字符的“名称”,并且该工具生成一个文本文件(“Name”.txt),然后将其上传到“服务器”(Mainframe和Unix)。我想将300个字符的字符串缩短为唯一可识别的8个字符的字符串(因为问题主要在大型机中),就像使用某种哈希算法的tinyurl。我找到了一个SHA1实现,但结果字符串长度为40个字符。有人可以为该算法提供VBA实现吗?将300个字符的字符串转换为VBA中唯一可识别的8个字符的字符串

生成的字符串长度为8个字符的要求是严格的 - 我的猜测是,它应该是可行的,因为我们对输入字符串的大小有限制。

回答

1

我认为Jens的想法应该可以正常工作。 如果截断SHA-1哈希不是你的东西,你可以使用CRC-32(32位〜8位ASCII字符从0..f)。 (你可以尝试使用this example) 就碰撞而言,CRC-32不太安全,但最终取决于你。

3

您可以只取SHA1哈希的前八个字符。尽管如此,这些哈希值(如原始的40个字符版本)并不保证是唯一的。如果您需要唯一性,您可能需要将每个名称与其简短版本一起存储,并只发布目前尚未使用的短名称。 (这就是tinyurl所做的。)

+0

虽然我对统计数学并没有任何了解,但只是将前八个字符切掉会大大增加碰撞的几率。 – MvanGeest 2010-07-29 08:37:10

+1

@MvanGeest:是的,它会的,但它可能还是够好的。如果您需要8个字符的base64编码散列,则您有64^8 = 2.8E14个不同的组合。如果哈希值相当随机,在约2000万条目中碰撞的几率达到50%,有200万条条目的机会不到1%。 – Jens 2010-07-29 08:53:07

相关问题