C# 完美的散列函数来模糊顺序值

C# 完美的散列函数来模糊顺序值,c#,algorithm,perfect-hash,C#,Algorithm,Perfect Hash,以下是我需要的(语言:C#4): 我正在建立一个你可以投诉的系统。投诉提交后,系统会为您提供一个唯一的9位数字编号,用于在系统中识别您的投诉 出于安全(通过模糊性实现安全)的目的,我不希望票证ID是连续的。但我不想使用数据库来生成顺序id 所以我需要的是一个内射函数,它在两方面都很快:从序列号到我的票证id,再从票证id到序列号 因此,我的ticketId在数据库中是顺序的,但在向用户显示之前,我会对其进行模糊处理,类似地,当我从用户那里得到一个数字时,我会对其进行模糊处理,并使用它在数据库中查

以下是我需要的(语言:C#4):

我正在建立一个你可以投诉的系统。投诉提交后,系统会为您提供一个唯一的9位数字编号,用于在系统中识别您的投诉

出于安全(通过模糊性实现安全)的目的,我不希望票证ID是连续的。但我不想使用数据库来生成顺序id

所以我需要的是一个内射函数,它在两方面都很快:从序列号到我的票证id,再从票证id到序列号

因此,我的
ticketId
在数据库中是顺序的,但在向用户显示之前,我会对其进行模糊处理,类似地,当我从用户那里得到一个数字时,我会对其进行模糊处理,并使用它在数据库中查找投诉

混淆部分不需要太复杂,只是对一般公众来说“不够明显”

例如,我可以简单地更改值的位,这将得到我(对于8位值):

0->0
1->128
2->192
3->64
4->160
5->96

等等


我建议采用对称加密。例如,如果应用加密算法的替换和扩散步骤,可以得到一个可以快速来回映射但很难找到模式的数字。这与您的示例几乎相同,但S-Box和P-Box值被证明对密码分析有效。

为什么不这样做:

SHA1您的号码,然后将其与序列号一起存储在数据库的表中。然后,当您收到散列时,只需在数据库中查找序列号


仅供参考,这不是真正的安全措施。你应该实现一个真正的密码系统。

我认为你可以完美地解决这个问题:用一个恒定的密钥加密票号

为什么你需要一个连续的数字和一个随机的数字?为什么不直接使用随机数作为真实ID呢?散列不应该是可逆的。如果你能逆转它,它被称为加密。9位数字真的不难破解-force@Tim不回答OP,但sequential保证唯一性,而“random”不保证唯一性(每次都不检查现有ID)。这似乎与yes非常相似,“通过模糊实现的安全性”不是真正的安全性。这就是为什么我说“通过模糊实现安全性”。内射函数不会多次映射到一个值。这是一个非内射函数,可以导致不明确的滴答声。完全正确。我删除了那一段。