散列机制将输入(0到2 ^ 32 - 1)散列为固定的可能12个字符的散列

时间:2014-12-31 12:29:40

标签: algorithm hash md5

我正在寻找一种方法来实现散列机制来将输入(0到2 ^ 32 - 1)散列为固定的可能12个字符的散列。

背景:

我有一个交易表,其中主键是自动递增(最大大小为2 ^ 32),我必须向客户显示发票号码,该发票号码必须具有正常的字符长度(我想12)因为客户端不应该将ID设为0000-0000-0001,所以我认为散列是最好的方法。

主要要求(我能想到的)是不应该进行多对一的映射,并且不应该很慢。

如果我使用常见的散列机制然后删除多余的字符,那会没关系。 (md5例如在php中生成32个字符串)?

我理解的方式是,不需要以加密方式保密,因此我可以生成自定义哈希。

类似的链接:

1)Symmetric Bijective Algorithm for Integers

2)Pseudo-random-looking one-to-one int32->int32 function

1 个答案:

答案 0 :(得分:0)

使用md5并删除大部分内容并不是一个好主意,因为无法保证您会获得唯一的缓存。此外,你有更容易的替代品,因为你有比你需要的更多的比特。

[0..2 32 ]范围内的值需要32位(duh!)。您有12个可打印字符,如果您保持在Base-64编码范围内,则会为您提供72位字符。你甚至不需要那么多的字符 - 你可以为每个字符使用三个字符作为最初的八个字符,最后四个字符每个字符使用两个比特。这样,您的12个字符将保留在['0'..'7']范围内,最后四个字符将位于['0'..'3']范围内。当然你没有数字数字 - 你可以使用一些数字组的字母,给它一个更多"随机化"外观

  

id是自动递增,我不认为我应该将发票号码设为000 ... 001等等。

在生成这些表示时从最低有效位开始,然后进入最低有效位,或者制作一个任意(但固定)的映射,其中哪些位转到12个字符表示中的哪个数字。这样,ID看起来不会是连续的,但仍然是完全可逆的。