Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 生成带有校验位的唯一公共用户标识符_C#_Algorithm_Luhn - Fatal编程技术网

C# 生成带有校验位的唯一公共用户标识符

C# 生成带有校验位的唯一公共用户标识符,c#,algorithm,luhn,C#,Algorithm,Luhn,我们在数据库中存储患者和护理提供者记录。我们需要为每个用户提供某种公共标识符,以唯一地识别他们,并使用某种校验位以最大限度地减少错误输入的机会 在我的研究中,我发现了Luhn alhorithm,用于信用卡号码;还有一些变体 但我想知道是否还有其他替代方案,可能是使用较短的标识符或包含字母数字字符,可能更适合用于公共用户标识符 或者使用信用卡号格式作为用户标识符也是一种有效的选择 根据这些评论,我得出了以下解决方案 首先,我渲染了一个由8个字符组成的LUID,如nathanchere在中所述 然

我们在数据库中存储患者和护理提供者记录。我们需要为每个用户提供某种公共标识符,以唯一地识别他们,并使用某种校验位以最大限度地减少错误输入的机会

在我的研究中,我发现了Luhn alhorithm,用于信用卡号码;还有一些变体

但我想知道是否还有其他替代方案,可能是使用较短的标识符或包含字母数字字符,可能更适合用于公共用户标识符


或者使用信用卡号格式作为用户标识符也是一种有效的选择

根据这些评论,我得出了以下解决方案

首先,我渲染了一个由8个字符组成的LUID,如nathanchere在中所述

然后,我附加一个用iso7064 MOD 1271,36标准计算的校验位,如前所述

我还添加了一个小检查,如果计算出的检查数字包含O、0、I或1,我将再次重新生成代码,直到它不再包含这些字符

结果是一个类似于6VXA35YDCE的代码,该代码相当独特(如果我的数学正确,则应该有类似于1.099.511.627.776的可能组合)。它也不包含I、1、O和0;以避免混淆

此外,在使用任何生成的LUID创建新用户之前,我要确保该LUID尚未存在于数据库中,以确保它在发生冲突时继续工作


我认为这满足了我一直在寻找的要求…

也许十六进制标识符可以让事情变得更简单?如果您不想使用GUID或自动递增的数字,这对您有帮助吗?这回答了你的问题吗?谢谢大家,我已经根据你们的评论回答了我自己的问题。首先,你们预计会有多少病人?意思是,您需要的唯一标识符的最大数量是多少?很高兴看到LUID很有用:)我也很想看看您是如何添加校验和的。我为以前的客户机做了类似的事情,但是使用了严格的数字校验和数字,因此删除1/0并不重要(如果需要手动输入,则可以很容易地将最后一个数字强制为数字,或者转换为O->0和I->1以适应用例)并且不需要重复传递来避免这些数字。我提取该示例时也忽略了一点,如果没有实现自动化测试的
ILUID
接口等,该类可能应该是
static
。@Nathanche对于检查数字,我使用了的实现。它具有所有ISO 7064校验位算法。
public class LUID
{
    private static readonly RNGCryptoServiceProvider RandomGenerator 
               = new RNGCryptoServiceProvider();
    private static readonly char[] ValidCharacters = 
               "ABCDEFGHJKLMNPQRSTUVWXYZ23456789".ToCharArray();
    public const int DefaultLength = 6;
    private static int counter = 0;

    public static string Generate(int length = DefaultLength)
    {
        var randomData = new byte[length];
        RandomGenerator.GetNonZeroBytes(randomData);

        var result = new StringBuilder(DefaultLength);
        foreach (var value in randomData)
        {
            counter = (counter + value) % (ValidCharacters.Length - 1);
            result.Append(ValidCharacters[counter]);
        }
        return result.ToString();
    }
}