相关疑难解决方法(0)

优惠券代码生成

我想生成优惠券代码,例如AYB4ZZ2.但是,我还希望能够标记使用过的优惠券并限制其全球数量N.天真的方法就是"生成N独特的字母数字代码,将它们放入数据库并在每个优惠券操作上执行数据库搜索".

但是,据我所知,我们还可以尝试找到一个函数 MakeCoupon(n),它将给定的数字转换为具有预定义长度的类似优惠券的字符串.

据我了解,MakeCoupon应满足以下要求:

  • 是双射的.反向MakeNumber(coupon)应该是有效可计算的.

  • 输出MakeCoupon(n)应该是字母数字,并且应该具有小且恒定的长度 - 因此它可以被称为人类可读的.例如,SHA1摘要不会通过此要求.

  • 实用的独特性.MakeCoupon(n)对于每种天然物的结果n <= N应该在相同的术语中是完全独特的或独特的,例如,MD5是独特的(具有相同的极小碰撞概率).

  • (这个定义很棘手)如何从单个优惠券代码中枚举所有剩余的优惠券并不明显 - 让我们说MakeCoupon(n)并且MakeCoupon(n + 1)应该在视觉上有所不同.

    例如MakeCoupon(n),,n用零填充的简单输出将不符合此要求,因为000001并且000002实际上并不"视觉上"不同.

问:

是否存在满足以下要求的任何功能或函数发生器?我的搜索尝试只引导我使用[CPAN]CouponCode,但它没有满足相应函数的双射要求.

c# algorithm hash coupon

49
推荐指数
3
解决办法
2万
查看次数

从Long id生成唯一哈希

我需要从类型的ID值生成唯一的哈希Long.我担心的是它不应该从两个不同的Long/long值全局生成相同的哈希值.

MD5哈希看起来很不错,但哈希字符串很长.我只需要角色

0-9
a-z and A-Z
Run Code Online (Sandbox Code Playgroud)

只有6个字符,如:j4qwO7

什么是最简单的解决方案?

java algorithm hash

3
推荐指数
1
解决办法
4059
查看次数

通过算法从用户 ID 生成唯一的随机朋友代码

我正在寻找一种方法来从一个连续的用户 ID 中为用户生成一个随机的、唯一的 9 位朋友代码。这背后的想法是,人们无法通过一一搜索好友代码来枚举用户。如果有 1000 个可能的代码和 100 个注册用户,搜索随机代码应该有 10% 的机会找到用户。

一种可能的方法是随机生成一个代码,检查该代码是否已被使用,如果是,则再试一次。我正在寻找一种方法(主要是出于好奇),其中朋友代码是通过算法生成的,并且第一次尝试时保证该用户 ID 是唯一的。

具体来说,给定一个数字范围(1 到 999,999,999),在这个数字上运行该函数应该返回同一范围内的另一个数字,该数字与输入数字成对且唯一。只有当范围发生变化和/或随机性的输入种子发生变化时,这种配对才会有所不同。

理想情况下,个人不应该在不知道种子和算法的情况下(或者拥有非常大的样本池和大量时间 - 这不需要加密安全)轻松地从朋友 ID 逆向工程用户 ID,所以简单地从最大范围中减去用户 ID 不是一个有效的解决方案。

下面是一些 C# 代码,它通过生成整个数字范围、打乱列表,然后通过将用户 ID 视为列表索引来检索朋友 ID 来完成我所追求的目标:

int start = 1; // Starting number (inclusive)
int end = 999999999; // End number (inclusive)
Random random = new Random(23094823); // Random with a given seed

var friendCodeList = new List<int>();
friendCodeList.AddRange(Enumerable.Range(start, end + 1)); // Populate list

int n = friendCodeList.Count;

// Shuffle the list, this …
Run Code Online (Sandbox Code Playgroud)

c# random algorithm math guid

3
推荐指数
1
解决办法
379
查看次数

如何使用密码和Java加密/解密12位十进制数到其他十进制数?

我已经阅读了使用Java来加密整数使用DES使用Pass Phrase加密.

我需要的只是一个简单的加密器,它将12位数字转换为12位数字,具有以下约束:

  1. 加密必须依赖于密码(在应用程序的整个生命周期内都是不变的),而不是其他任何密码.
  2. 映射必须为1-1(无散列和多个输入给出相同的输出,反之亦然).
  3. 映射不能在不同的VM之间更改,或者在启动VM时(例如,当您重新启动Java时,该实用程序应该为您提供相同的映射,这意味着它必须完全依赖于提供的密码).
  4. 以0开头的数字不是有效的12位数字(输入数字也不会以0开头).
  5. 密钥/密码永远不应该是可猜测的.例如,运行具有多个输入的实用程序并分析输出不应该允许人们猜测键/ pwd/hash或其他.
  6. 所有输入将精确地为12位且小于12位数的素数(这意味着我们可以使用模运算).

通过文献搜索我有这个代码与我

public void mytestSimple(long code, String password) throws Exception {
    SecretKey key = new SecretKeySpec(password.getBytes(), "DES");
    Cipher ecipher = Cipher.getInstance("DES");
    ecipher.init(Cipher.ENCRYPT_MODE, key);
    System.out.println(ecipher.getOutputSize(8));

    byte[] encrypted = ecipher.doFinal(numberToBytes(code));
    System.out.println(encrypted + "--" + encrypted.length);

    Cipher dcipher = Cipher.getInstance("DES");
    dcipher.init(Cipher.DECRYPT_MODE, key);
    byte[] decrypted = dcipher.doFinal(encrypted);
    System.out.println(bytesToNumber(decrypted) + "--" + decrypted.length);
}

public void testSimple() throws Exception {
    mytestSimple(981762654986L, "password");
}
Run Code Online (Sandbox Code Playgroud)

我遇到了问题

  1. 如何将16个字节转换为12位数字.
  2. 保持1-1映射.
  3. 在多个VM调用中保持加密/解密相同.

****我在下面添加的答案****

我添加了一个答案,即从标准Ja​​va RSA密钥对逻辑中提取的40位RSA.我仍然需要研究边缘情况.我将接受答案并提出"Tadmas",我认为有点引导我回答.有人能告诉我我的算法是否会变弱/可攻击吗?

java encryption

1
推荐指数
2
解决办法
9815
查看次数

标签 统计

algorithm ×3

c# ×2

hash ×2

java ×2

coupon ×1

encryption ×1

guid ×1

math ×1

random ×1