Генерация серийного номера - PullRequest
1 голос
/ 22 декабря 2009

Итак, я создаю класс активации для проекта VB6, и я столкнулся с умственным пердением. Я разработал способ создания серийного номера для этого конкретного продукта следующим образом.

XXXX-XXXX-XXXX-XXXX

Каждая группа чисел будет представлять данные, которые я могу прочитать, если я знаю о соответствующем документе, который позволяет мне понимать коды с группой цифр. Так, например, первая группа может представлять месяц, когда продукт был продан покупателю. Но у меня не может быть, чтобы все серийные номера в январе начинались с тех же четырех цифр, поэтому для вычисления этого значения необходимо выполнить некоторую внутреннюю математику. Я приземлился на это:

A B C D = цифры в первой группе серийного номера (A + B) - (C + D) = #

Теперь # будет относиться к таблице шестнадцатеричных значений, которая будет представлять месяц, когда продукт был продан. Что-то вроде ...

1 - январь

2 - февраль

3 - март

....

B - ноябрь

C - декабрь

Мой вопрос лежит здесь - если я знаю, что мне нужно, чтобы сумма равнялась B (11), то как именно я могу кодировать в обратном направлении, чтобы сгенерировать (A + B) - (C + D) = B (11) ?? Это довольно простое уравнение, я знаю - но кое-что, с чем я только что столкнулся и не могу начать в правильном направлении. Я не прошу полной обработки кода, а просто толчок. Если у вас есть полное решение и вы хотите поделиться им, я всегда открыт для изучения.

Я кодирую в VB6, но решения VB.NET, C #, C ++ также могут работать, поскольку я могу относительно легко переносить их. Помощь сообщества всегда ценится!

Ответы [ 3 ]

2 голосов
/ 22 декабря 2009

Нет единого решения (у вас есть одно уравнение с четырьмя переменными). Вы должны выбрать несколько случайных чисел. Вот тот, который работает (в Python, но вы понимаете):

from random import randint

X = 11 # the one you're looking for

A_plus_B = randint(X, 30)
A = randint(max(A_plus_B - 15, 0), min(A_plus_B, 15))
B = A_plus_B - A

C_plus_D = A_plus_B - X
C = randint(max(C_plus_D - 15, 0), min(C_plus_D, 15))
D = C_plus_D - C

Полагаю, вы разрешаете шестнадцатеричные цифры; если вы просто хотите от 0 до 9, замените 15 на 9, а 30 на 18.

0 голосов
/ 22 декабря 2009

Это может показаться немного хакерским, и это может не привести вас туда, куда вы пытаетесь пойти. Однако это должно привести к более широкому диапазону значений для ваших ключевых строк:

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
0 голосов
/ 22 декабря 2009

ОК - ручка и бумага - это всегда решение ... так что вот так ...

Попытка найти, какие значения должны быть для (A + B) - (C + D) равным определенному числу, называемому X. Сначала я знаю, что хочу значения HEX, чтобы ограничить меня значениями 0-F или 0-15. , Оттуда мне нужно лучшее начальное место, поэтому я сгенерирую случайное число, которое будет представлять сумму (A + B), мы назовем это Y, но не ниже значения X. Затем вычтем из этого числа значение Y из X, чтобы определить это значение, которое будет представлять (C + D), которое мы назовем Z. Используйте похожую логику, чтобы разбить Y и Z на два числа, каждое из которых может представлять (A + B) = Y и (C + D). ) = Z. После того, как все это сказано и сделано, у меня должна быть хорошая рандомизация для создания 4 чисел, которые при подключении к моему уравнению вернут подходящий результат.

Просто нужно было пройти через мозг пердеть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...