C# .NET中的长/大数字和模数

C# .NET中的长/大数字和模数,c#,.net,modulo,C#,.net,Modulo,我目前正在编写一个快速自定义编码方法,其中我在一个键上加盖一个数字戳,以验证它是否是一个有效的键 基本上,我是从编码中得到任何数字,然后乘以一个键 然后,我会将这些数字乘以部署到购买密钥的用户/客户。我只想使用(代码%Key==0)来验证该键是否有效,但对于大值,mod函数似乎无法按预期运行 数字=468721387; 密钥=12345678; 代码=数字*键 使用上述数字: 代码%Key==11418772 对于较小的数字,它将正确返回0。有没有可靠的方法来检查.NET中长时间的整除性 谢谢

我目前正在编写一个快速自定义编码方法,其中我在一个键上加盖一个数字戳,以验证它是否是一个有效的键

基本上,我是从编码中得到任何数字,然后乘以一个键

然后,我会将这些数字乘以部署到购买密钥的用户/客户。我只想使用(代码%Key==0)来验证该键是否有效,但对于大值,mod函数似乎无法按预期运行

数字=468721387; 密钥=12345678; 代码=数字*键

使用上述数字: 代码%Key==11418772

对于较小的数字,它将正确返回0。有没有可靠的方法来检查.NET中长时间的整除性

谢谢

编辑: 好吧,告诉我,如果我很特别,错过了什么

        long a = DateTime.Now.Ticks;
        long b = 12345;
        long c = a * b;
        long d = c % b;
        d == 10001 (Bad)


我做错了什么?

显然,您的
code
无法适应
int
数据类型。尝试改用
long

long code = (long)number * key;

(长)
强制转换是必需的。如果没有强制转换,乘法将以32位整数形式进行(假设键入了
number
key
变量
int
),结果将强制转换为
long
,这不是您想要的。通过将其中一个操作数强制转换为
long
,您告诉编译器对两个
long
数字执行乘法。

显然,您的
code
无法适应
int
数据类型。尝试改用
long

long code = (long)number * key;

(长)
强制转换是必需的。如果没有强制转换,乘法将以32位整数形式进行(假设键入了
number
key
变量
int
),结果将强制转换为
long
,这不是您想要的。通过将其中一个操作数强制转换为
long
,可以告诉编译器对两个
long
数字执行乘法。

整数溢出…请参阅我的注释

您正在执行的乘法值溢出
int
数据类型,并导致其换行(
int
值介于+/-2147483647之间)

选择一个更合适的数据类型来保存一个大到5786683315615386的值(乘法的结果)

更新

你的新例子稍微改变了一些情况

您使用的是long,但现在使用的是System.DateTime.Ticks,它在Mono(不确定MS平台)上返回633909674610619350


当你把它乘以一个大的数字时,你现在溢出了一个
long
,就像你之前溢出了一个
int
一样。在这一点上,您可能需要使用
double
来处理所需的值(
decimal
也可以工作,具体取决于乘数的大小)。

整数溢出…请参阅我的评论

您正在执行的乘法值溢出
int
数据类型,并导致其换行(
int
值介于+/-2147483647之间)

选择一个更合适的数据类型来保存一个大到5786683315615386的值(乘法的结果)

更新

你的新例子稍微改变了一些情况

您使用的是long,但现在使用的是System.DateTime.Ticks,它在Mono(不确定MS平台)上返回633909674610619350


当你把它乘以一个大的数字时,你现在溢出了一个
long
,就像你之前溢出了一个
int
一样。在这一点上,您可能需要使用
double
来处理所需的值(
decimal
也可以工作,这取决于您的乘数有多大)。

正如其他人所说,您的问题是整数溢出。您可以通过在“高级构建设置”对话框中选中“检查算术溢出/下溢”使这一点更加明显。执行此操作时,在执行*DateTime.Now.Ticks*12345*时将得到OverflowException

一个简单的解决方案是将代码中的“long”改为“decimal”(或“double”)

在.NET4.0中,有一个新类


最后,您说您正在“…编写一种快速自定义编码方法…”,因此一个简单的自制解决方案可能会满足您的需要。然而,如果这是生产代码,您可能会考虑更为健壮的解决方案,涉及加密或来自专门从事软件许可的第三方。

< P>正如其他人所说,您的问题是整数溢出。您可以通过在“高级构建设置”对话框中选中“检查算术溢出/下溢”使这一点更加明显。执行此操作时,在执行*DateTime.Now.Ticks*12345*时将得到OverflowException

一个简单的解决方案是将代码中的“long”改为“decimal”(或“double”)

在.NET4.0中,有一个新类


最后,您说您正在“…编写一种快速自定义编码方法…”,因此一个简单的自制解决方案可能会满足您的需要。然而,如果这是生产代码,您可能会考虑更为健壮的解决方案,涉及加密或来自专门从事软件许可的第三方的一些东西。

< P>回答说整数溢出是可能的罪魁祸首,几乎可以肯定是正确的;您可以通过在乘法周围放置一个“checked”块并查看它是否引发异常来验证这一点

但这里有一个更大的问题,每个人似乎都忽视了

最好的办法是退后一大步,重新考虑整个计划的智慧。看起来您正试图设计一个基于密码的安全系统,但您显然不是密码算法方面的专家。那是一面巨大的红色警告旗如果您需要基于加密的安全系统,请不要尝试推出您自己的。有很多现成的cr