Vb6 生成序列号

Vb6 生成序列号,vb6,random,activation,Vb6,Random,Activation,所以我正在为一个VB6项目创建一个激活类,我遇到了一个大脑屁。我已经按照以下方式设计了如何生成此特定产品的序列号 XXXX-XXXX-XXXX-XXXX 如果我知道匹配的文档允许我理解带有数字组的代码,则每组数字将代表我可以读取的数据。例如,第一组可能代表产品销售给客户的月份。但是我不能让一月份所有的序列号都以相同的四位数开始,所以需要做一些内部数学来计算这个值。我看到的是: A B C D=序列号第一组中的数字 (A+B)-(C+D)=# 现在#将与十六进制值表相关,该表将表示产品的销售月份。

所以我正在为一个VB6项目创建一个激活类,我遇到了一个大脑屁。我已经按照以下方式设计了如何生成此特定产品的序列号

XXXX-XXXX-XXXX-XXXX

如果我知道匹配的文档允许我理解带有数字组的代码,则每组数字将代表我可以读取的数据。例如,第一组可能代表产品销售给客户的月份。但是我不能让一月份所有的序列号都以相同的四位数开始,所以需要做一些内部数学来计算这个值。我看到的是:

A B C D=序列号第一组中的数字 (A+B)-(C+D)=#

现在#将与十六进制值表相关,该表将表示产品的销售月份。类似于

1月1日至1月

2月2日至2月

3月3日至3月

B-11月

C-12月

我的问题就在这里——如果我知道我需要总数等于B(11),那么我如何准确地反向编码以生成(A+B)-(C+D)=B(11)??我知道,这是一个相当简单的方程式,但我刚刚遇到了一些事情,似乎无法朝着正确的方向开始。我不是要求对代码进行全面的修改,而是要求进行一次推送。如果你有一个完整的解决方案,并想与大家分享,我随时愿意学习更多


<>我在VB6中编码,但是VB.NET、C、C++解决方案也可以工作,因为我可以比较容易地把它们移植过来。非常感谢社区的帮助

没有单一的解决方案(您有一个包含四个变量的方程)。你必须选择一些随机数。下面是一个可行的方法(在Python中,但您明白了这一点):


我假设您允许十六进制数字;如果你只想要0到9,用9替换15,用18替换30。

好的-纸笔永远是解决方案。。。所以这里是

试图找出(A+B)-(C+D)的值应该等于某个称为X的数字。首先,我知道我需要十六进制值,以便将我限制为0-F或0-15。从这里开始,我需要一个更好的起点,所以我将生成一个随机数,代表(a+B)的总和,我们称之为Y,但不小于值X。然后从该数字中减去Y值X,以确定代表(C+D)的值,我们将其称为Z。使用类似的逻辑将Y和Z分解为两个数字,每个数字可以表示(A+B)=Y和(C+D)=Z。在所有这些都说了和做了之后,我应该有一个很好的随机化,创建4个数字,当插入我的等式时,将返回一个合适的结果


只是需要通过大脑放屁。

这可能看起来有点刻薄,而且它可能不会带你去你想去的地方。但是,它应该为键字符串生成更大范围的值:

Option Explicit

Private Function MonthString(ByVal MonthNum As Integer) As String
    'MonthNum: January=1, ... December=12.  Altered to base 0
    'value for use internally.
    Dim lngdigits As Long

    MonthNum = MonthNum - 1
    lngdigits = (Rnd() * &H10000) - MonthNum
    MonthString = Right$("000" & Hex$(lngdigits + (MonthNum - lngdigits Mod 12)), 4)
End Function

Private Function MonthRecov(ByVal MonthString As String) As Integer
    'Value returned is base 1, i.e. 1=January.
    MonthRecov = CInt(CLng("&H" & MonthString) Mod 12) + 1
End Function

Private Sub Form_Load()
    Dim intMonth As Integer
    Dim strMonth As String
    Dim intMonthRecov As Integer
    Dim J As Integer

    Randomize
    For intMonth = 1 To 12
        For J = 1 To 2
            strMonth = MonthString(intMonth)
            intMonthRecov = MonthRecov(strMonth)
            Debug.Print intMonth, strMonth, intMonthRecov, Hex$(intMonthRecov)
        Next
    Next
End Sub

您对ABCD有特殊要求吗?如果你只是“不能让1月份的所有序列号都以相同的四位数字开头”,那么你应该用它们来编码年份。您是否也要对cusomter编号进行编码?或者类似CRC的东西?对数字没有要求,除了它们遵循(A+B)-(C+D)=十六进制值的等式,对于我所讨论的月份表。其他几组数字的处理方式类似,但并不精确。我只是需要帮助来克服我头脑中的以下问题:如果我知道我需要我的值为B,或者11,那么我如何才能创建插入方程式的数字,从而创建A/B/C/D的值?我们必须同时更新。谢谢你的回复!这有助于巩固这种方法对我的作用。
Option Explicit

Private Function MonthString(ByVal MonthNum As Integer) As String
    'MonthNum: January=1, ... December=12.  Altered to base 0
    'value for use internally.
    Dim lngdigits As Long

    MonthNum = MonthNum - 1
    lngdigits = (Rnd() * &H10000) - MonthNum
    MonthString = Right$("000" & Hex$(lngdigits + (MonthNum - lngdigits Mod 12)), 4)
End Function

Private Function MonthRecov(ByVal MonthString As String) As Integer
    'Value returned is base 1, i.e. 1=January.
    MonthRecov = CInt(CLng("&H" & MonthString) Mod 12) + 1
End Function

Private Sub Form_Load()
    Dim intMonth As Integer
    Dim strMonth As String
    Dim intMonthRecov As Integer
    Dim J As Integer

    Randomize
    For intMonth = 1 To 12
        For J = 1 To 2
            strMonth = MonthString(intMonth)
            intMonthRecov = MonthRecov(strMonth)
            Debug.Print intMonth, strMonth, intMonthRecov, Hex$(intMonthRecov)
        Next
    Next
End Sub