如何为实体创建唯一的7位数代码?

Dam*_*isa 10 random hash uniqueidentifier

当用户在我的系统中添加新项目时,我想为该项目生成唯一的非递增伪随机7位数代码.创建的项目数量仅为数千(<10,000).

因为它需要是唯一的,并且没有两个项目具有相同的信息,我可以使用哈希,但它需要是一个他们可以与其他人共享的代码 - 因此是7位数.

我原来的想法只是循环生成一个随机数,检查它是否已经使用过,如果是,则冲洗并重复.鉴于碰撞可能性低,我认为这是一个合理的解决方案.

回应这个问题,建议生成所有未使用的号码清单和洗牌它们.我可能会在数据库中保留这样的列表,但是我们正在谈论10,000,000个条目,这些条目相对较少.

有没有人有更好的方法?

ken*_*ytm 15

选择一个7位A和一个大B,和

int nth_unique_7_digit_code(int n) {
    return (n * B) % A;
}
Run Code Online (Sandbox Code Playgroud)

所有唯一代码这样产生的数据将是一个.

如果你想更"安全",这样做pow(some_prime_number, n) % A,即

static int current_code = B;
int get_next_unique_code() {
   current_code = (B * current_code) % A;
   return current_code;
}
Run Code Online (Sandbox Code Playgroud)

  • 它是基本数论,它起作用,因为A是素数而GCD(A,B)= 1.它保证没有重复,结果"看起来"是随机的. (4认同)

Rob*_*Day 5

您可以使用递增ID,然后在某个固定键上对其进行异或.

const int XORCode = 12345;

private int Encode(int id)
{
    return id^XORCode;
}

private int Decode(int code)
{
    return code^XORCode;
}
Run Code Online (Sandbox Code Playgroud)