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

Algorithm 散列机制,将输入(0到2^32-1)散列为一个固定的可能是12个字符的散列,algorithm,hash,md5,Algorithm,Hash,Md5,我正在寻找一种实现散列机制的方法,将输入(0到2^32-1)散列到一个可能是12个字符的固定散列 背景: 我有一个事务表,其中主键是自动递增的(最大大小为2^32),我必须向客户机显示一个发票号,该发票号必须具有适当的字符长度(我认为是12个),因此,由于客户机不应获得id 0000-0000-0001,我认为哈希是最好的方法 主要要求(我可以想到)是多对一映射永远不应该发生,也不应该很慢 如果我使用一个普通的散列机制,然后删除多余的字符,可以吗。(例如,php中的md5生成32个字符串) 按照

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

背景:

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

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

如果我使用一个普通的散列机制,然后删除多余的字符,可以吗。(例如,php中的md5生成32个字符串)

按照我的理解,不需要加密安全,因此如果可能,我可以生成自定义哈希

类似链接:

(一)


2)

使用
md5
并切掉其中的大部分不是一个好主意,因为无法保证您将获得唯一的缓存。此外,您还有更简单的选择,因为您拥有的比特数远远超过了您的需要

[0..232]范围内的值需要32位(duh!)。您有12个可打印字符,如果您保持在字符的Base-64编码范围内,则可以获得72位。你甚至不需要那么多的字符——你可以在开始的8个字符中使用每个字符3位,在最后的4个数字中使用每个字符2位。这样,您的12个字符将保持在
['0'..'7']
范围内,最后四个字符将保持在
['0'..'3']
范围内。当然,您不必绑定数字-您可以使用字母来表示某些数字组,以使其具有更“随机”的外观

id是自动递增的,我不认为我应该给出发票号000…001等等


生成这些表示时,从最低有效位开始,然后继续执行最低有效位,或者创建任意(但固定)映射,将哪些位映射到12个字符表示中的哪个位。这样,id看起来就不会是连续的,而是完全可逆的。

id应该是什么样子?为什么不可能只返回主键呢?制作自己的散列算法很好,很有趣,但也比看起来更难。在已知算法上删除“不需要的字符”是危险的。你可以打重复的。话虽如此,Git使用SHA-1,前8个字符通常足以表示“实践中的唯一性”。如果不仔细检查的话,我是不会相信的!新年快乐。@user2040251:id是自动递增的,我不认为我应该给出发票号000…001等等。与模2^32的任何奇数相乘是一个双射,这样可以保证没有重复项,但无论如何都会将其重新排列(选择一个大数,否则会非常明显),但是任何人只要稍微看一眼,就会明白你做了什么。埃里克·利珀特展示了一个简单的方法,用乘法求逆。看见