哈希机制,用于将输入(0 到 2^32 - 1)哈希为固定的 12 个字符哈希



我正在寻找一种实现哈希机制的方法,以将输入(0 到 2^32 - 1)哈希为固定的 12 个字符哈希。

背景:

我有一个交易表,其中主键是自动递增(最大大小为 2^32),我必须向客户显示发票 no,该发票必须具有合适的字符长度(我认为 12),因此由于客户不应该获得 id 为 0000-0000-0001,我认为哈希是最好的方法。

主要要求(我能想到的)是多对一映射永远不应该发生,也不应该很慢。

如果我使用通用的哈希机制然后删除额外的字符,可以吗?(例如 PHP 中的 MD5 生成 32 个字符的字符串)?

据我了解,没有必要加密安全,因此如果可能的话,我可以生成自定义哈希。

类似链接:

1) 整数的对称双射算法

2) 伪随机外观一对一 int32->int32 函数

使用md5并切断大部分内容不是一个好主意,因为不能保证你会得到一个唯一的缓存。此外,您有更简单的替代方案可供您使用,因为您的位比您需要的要多得多。

[0..232] 范围内的值需要 32 位(嘟!您有 12 个可打印字符,如果您保持在 Base-64 编码字符范围内,则为您提供 72 位。您甚至不需要那么多字符 - 对于最初的八个字符,您可以为每个字符使用三位,对于最后四位数字,每个字符使用两位。这样,您的 12 个字符将保持在 ['0'..'7'] 范围内,最后四个字符将保持在 ['0'..'3'] 范围内。当然,您不受数字的约束 - 您可以对某些数字组使用字母,以使其具有更"随机"的外观。

ID 是自动递增的,我认为我不应该给出发票编号为 000...001 等。

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

最新更新