我有一个整数列表(emplyoee的ID) 他们是8位长(虽然几乎所有启动00,但它们是有效的8位数字)基于输入号码随机密钥
为每位员工我需要生成一个关键是:
- 5 chars including [A-Z][a-z][0-9]
- Must include 1 of [A-Z]
- Must include 1 of [0-9]
- Generated key must be unique
- If I know an employees ID I should not be able to determine their key
我需要生成算法,将生成的密钥,但我想,以避免可能的话,记录键针对员工。我越想我遇到的问题就越多。
如果我能避免它,我不想生成所有的密钥,并将它们存储的地方 - 我宁愿他们是实时计算
允许我藏在我的系统中一个秘密,我可以除非你知道秘密,否则确保密钥不确定。
我想过使用标准哈希algroythms(含盐),但目标空间的限制和包括1 A-Z和1 0-9的限制似乎阻止了这一点。
的一种方式,我想我可能会用它来解决这个问题:
1. Build a deteremnistic function that maps integers starting from 1 [1, 2, 3, ...] to every possible result value
2. Map integers [1, 2, ...] to random other integers in the desired range [324, 43565, ...] in a way that preserves uniqueness (based on a secret salt which if changed would result in a different order).
这将保证唯一性,但第1步是棘手。结果集是不连续的,有些值可能会丢失大写字母,而其他值会丢失一个数字。
我可以通过开始每个代码与A1技术上可行,但减少结果空间从5个字符到3个字符。
任何人都可以建议一些简单的工作,并避免我必须记录所有生成的结果进行独特的检查吗?
对于密码编码部分:取自[A-Z]的第一个字符,取自[0-9]的第二个字符和整个集合中剩下的三个字符。这给你26 * 10 * 62 * 62 * 62(= 61,965,280)的可能性。这并不完全覆盖8位数字,而是接近 - 所以你可能不需要改变[A-Z]和[0-9]的位置。有了一些数学,你可以在密码和[0-61,965,279]之间转换。 –
如果您确实需要覆盖整个8位数范围,请将50,000,000以下的地图数字映射到[AZ] [0-9] [?] [?] [?]以及上面的[0-9] [AZ] [? ] [?] [?]。字符串模式不重叠。字符串生成和解析的决定很简单:数字低于50,000,000,而第一个字符是字母。 –
我很高兴我在这里发布拉尔夫,那个答案是1号的路要走。从员工ID到密钥的确定性,唯一性和秘密映射函数的任何想法? – Robert3452