[AccessD] OT(kinda): Crack Code

MartyConnelly martyconnelly at shaw.ca
Fri Mar 23 12:22:09 CDT 2007


I find the hashstring function useful for indexing and sorting
correctly things like legal numbering systems that go 1.0.12 and 1.01.12
or odd alphanumeric natural keys. AA123BB AA12BB etc
It could be used to setup your own collating sequence.

Mark A Matte wrote:

> Thanks Marty,
>
> I found that it is actually counting from UNIX time 1/1/1970 00:00:00 
> UTC...which happens to be 12/31/1969 4:00:00 PM in my time zone.  it 
> is a 36 base counting system...and I had to shift my initial logic ove 
> 2 spaces.  You take the following and add all of the results to come 
> up with a single number...this number is how many seconds have passed 
> since your start time.
>
>>> > 1st  Value*60466176
>>> > 2nd  Value*1679616
>>> > 3rd  Value*46656
>>> > 4th  Value*1296
>>> > 5th  Value*36
>>> > 6th  Value
>>
>
> The last 2 are irrelevant when converting back to time...they are 
> there for when more than 1 record is created in a single second.
>
> Thanks again,
>
> Mark A. Matte
>
>> From: MartyConnelly <martyconnelly at shaw.ca>
>> Reply-To: Access Developers discussion and problem 
>> solving<accessd at databaseadvisors.com>
>> To: Access Developers discussion and problem 
>> solving<accessd at databaseadvisors.com>
>> Subject: Re: [AccessD] OT(kinda): Crack Code
>> Date: Thu, 22 Mar 2007 18:32:50 -0700
>>
>>  I played around with this last night and figured out it was based on
>> some date in 1974
>> with AM and PM being indicated by last two characters and first 6 as 
>> seconds
>> from the start date whatever that is, still  it seems a little out as to
>> accuracy
>>
>>
>> Here is some code I used from some old code, you want to switch
>> to Base 36 and omit 0 will alter some counters
>>
>> Const hashFactor As Integer = 37
>> Const hashLength As Integer = 9
>>
>> Function HashString(strHash As String) As Double
>> ' Create Hash string for indexing using
>> 'Base 37 Hash Value
>> ' Convert
>> ' spaces punctuation odd chars = 0
>> ' numeric = 0 - 9                1-10
>> ' alpha chars a-z A-Z            11-37
>> ' only use lower case
>> 'such that string "Ab-12" =
>> '      A           b          -          1          2
>> '  (11*37^4) + (12*37^3) + (0*37^2) + (2*37^1) + (3*37^0)
>> 'The Hash Length is 9 so it fits a double without precision loss
>>
>> Dim iStrLen As Integer
>> Dim decAsc As Double
>> Dim i As Integer
>> Dim strPad As Integer
>> Dim strToHash As String
>> HashString = 0
>>
>> ' convert to all lower case
>> strToHash = UCase(strHash)
>> iStrLen = Len(strToHash)
>>
>> 'pad out string to 9 chars with blanks
>> If iStrLen < hashLength Then
>>  For strPad = (iStrLen + 1) To hashLength
>>     strToHash = strToHash & " "
>>  Next
>> Else
>> ' or just grab first nine chars of string
>>    If iStrLen > hashLength Then
>>      strToHash = Left(strToHash, hashLength)
>>    End If
>> End If
>>
>> For i = 1 To hashLength
>>   decAsc = Asc(Right(strToHash, i))
>>   'convert all odd Ascii character values and punctuation to 0
>>   If (decAsc < 48) Or (decAsc >= 58) And (decAsc <= 64) _
>>      Or (decAsc > 91) Then
>>     decAsc = 0
>>   Else
>>      'numbers
>>     If (decAsc >= 48) And (decAsc <= 57) Then
>>        decAsc = decAsc - 47
>>      Else
>>      'letters
>>       If (decAsc >= 65) And (decAsc <= 91) Then
>>          decAsc = decAsc - 54
>>          ' 54 not 64 as want to start "A" as 11
>>         End If
>>      End If
>>   End If
>>
>>   HashString = HashString + (decAsc * hashFactor ^ (i - 1))
>> Next
>>
>> End Function
>>
>> Sub unhash()
>> ' H9WDH701
>> Dim total As Double
>> Dim mydate As Date
>> Dim days As Double
>> total = (2 * 37 ^ 0)
>> Debug.Print total
>> total = total + (0 * 37 ^ 1)
>> Debug.Print total
>> total = total + (7 * 37 ^ 2)
>> Debug.Print total
>> total = total + ((Asc("H") - 54) * 37 ^ 3)
>> Debug.Print total
>> total = total + ((Asc("D") - 54) * 37 ^ 4)
>> Debug.Print total
>> total = total + ((Asc("W") - 54) * 37 ^ 5)
>> Debug.Print total
>> total = total + (9 * 37 ^ 6)
>> Debug.Print total
>> total = total + ((Asc("H") - 54) * 37 ^ 7)
>> Debug.Print total
>> 'mydate = total
>> days = total / (3600# * 24# * 365#)
>> Debug.Print "days=" & days
>> End Sub
>> Sub unhashA()
>> ' H9WDH701
>> Dim total As Double
>> Dim mydate As Date
>> Dim days As Double
>> total = (2 * 36 ^ 0)
>> Debug.Print total
>> total = total + (0 * 36 ^ 1)
>> Debug.Print total
>> total = total + (7 * 36 ^ 2)
>> Debug.Print total
>> total = total + ((Asc("H") - 55) * 36 ^ 3)
>> Debug.Print total
>> total = total + ((Asc("D") - 55) * 36 ^ 4)
>> Debug.Print total
>> total = total + ((Asc("W") - 55) * 36 ^ 5)
>> Debug.Print total
>> total = total + (9 * 36 ^ 6)
>> Debug.Print total
>> total = total + ((Asc("H") - 55) * 36 ^ 7)
>> Debug.Print total
>> 'mydate = total
>> days = total / (3600# * 24# * 365#)
>> Debug.Print "days=" & days
>> End Sub
>> Sub unhashB()
>> ' H9WDH701 02/06/03 09:19:55 AM
>> 'days=33.1225264776763
>> ' 12/02/1974 10:45:12 PM
>> Dim total As Double
>> Dim mydate As Date
>> Dim days As Double
>>
>> total = total + (7 * 36 ^ 0)
>> Debug.Print total
>> total = total + ((Asc("H") - 55) * 36 ^ 1)
>> Debug.Print total
>> total = total + ((Asc("D") - 55) * 36 ^ 2)
>> Debug.Print total
>> total = total + ((Asc("W") - 55) * 36 ^ 3)
>> Debug.Print total
>> total = total + (9 * 36 ^ 4)
>> Debug.Print total
>> total = total + ((Asc("H") - 55) * 36 ^ 5)
>> Debug.Print total
>> 'mydate = total
>> days = total / (3600# * 24# * 365#)
>> Debug.Print "days=" & days
>> Debug.Print DateAdd("s", -total, Now)
>> End Sub
>>
>> Sub unhashC()
>> '  H9WLA903=02/06/03 12:08:33 PM
>> '12/02/1974 7:59:40 PM
>> Dim total As Double
>> Dim mydate As Date
>> Dim days As Double
>>
>> total = total + (9 * 36 ^ 0)
>> Debug.Print total
>> total = total + ((Asc("A") - 55) * 36 ^ 1)
>> Debug.Print total
>> total = total + ((Asc("L") - 55) * 36 ^ 2)
>> Debug.Print total
>> total = total + ((Asc("W") - 55) * 36 ^ 3)
>> Debug.Print total
>> total = total + (9 * 36 ^ 4)
>> Debug.Print total
>> total = total + ((Asc("H") - 55) * 36 ^ 5)
>> Debug.Print total
>> 'mydate = total
>> days = total / (3600# * 24# * 365#)
>> Debug.Print "days=" & days
>> Debug.Print DateAdd("s", -total, Now)
>> End Sub
>> Sub test()
>> Dim date1 As Date
>> Dim date2 As Date
>> date1 = #2/6/2003 12:08:33 PM#
>> date2 = #2/6/2003 9:19:55 AM#
>>
>> Debug.Print DateDiff("s", date1, date2)
>> date1 = #12/2/1974 7:59:40 PM#
>> date2 = #12/2/1974 10:45:12 PM#
>>
>> Debug.Print DateDiff("s", date1, date2)
>> End Sub
>>
>> Mark A Matte wrote:
>>
>> > Tha might be what the guy meant by 'shift a bit or 2'.
>> >
>> > I'm running frequency distribution on each char...and 7th char is 0
>> > everytime except for 2 times out of 500K...
>> >
>> > Thanks for the 'shift'  I'll move all calcs over to spaces...and see
>> > what I get.
>> >
>> > Thanks,
>> >
>> > Mark A. Matte
>> >
>> >
>> >
>> >> From: "Gary Kjos" <garykjos at gmail.com>
>> >> Reply-To: Access Developers discussion and problem
>> >> solving<accessd at databaseadvisors.com>
>> >> To: "Access Developers discussion and problem
>> >> solving"<accessd at databaseadvisors.com>
>> >> Subject: Re: [AccessD] OT(kinda): Crack Code
>> >> Date: Thu, 22 Mar 2007 13:57:32 -0500
>> >>
>> >> If you use that logic and you forget about the rightmost two 
>> positions
>> >> - maybe an occurance number or something, you can get close....
>> >> H = 1027924991 +
>> >> 9 = 15116544
>> >> W = 1492992
>> >> D = 16848
>> >> H = 612
>> >> 7 = 7
>> >> ---------------------
>> >> 1044551995
>> >>
>> >> which translates to Thursday, February 06, 2003 11:19:55 AM
>> >>
>> >> 2 hours off?
>> >>
>> >> I haven't tried it for any others but that one seems pretty scary
>> >> close for the first one I tried.
>> >>
>> >> For example in your first example. H9WDH701 = 02/06/03 09:19:55 = 
>> that
>> >> translates to 1044523195 in UNIX time. According to the time
>> >> calculators I googled.
>> >>
>> >> On 3/22/07, Mark A Matte <markamatte at hotmail.com> wrote:
>> >> > Rocky,
>> >> >
>> >> > I've actually made some progress.  Last year I learned how to do
>> >> Mayan Math
>> >> > and applied the logic as a counting system not 10 or 20 base...but
>> >> 36...and
>> >> > after learning that this thing is counting seconds since 1/1/70
>> >> 00:00:00...I
>> >> > assigned values to the numbers and letters. and started running
>> >> some tests.
>> >> > 0=0,1=1,2=2...9=9,A=10,B=11...Z=35.
>> >> >
>> >> > This makes it a 36 base counting system...so you take the value of
>> >> each
>> >> > position...calculate and add like below:
>> >> >
>> >> > 1st  ???
>> >> > 2nd  ???
>> >> > 3rd  Value*60466176
>> >> > 4th  Value*1679616
>> >> > 5th  Value*46656
>> >> > 6th  Value*1296
>> >> > 7th  Value*36
>> >> > 8th  Value
>> >> >
>> >> > So if you had 00bfk5t2...you math would be Value of third position
>> >> > ('B'11*60466176) added to each position calculated...so:
>> >> > 0's are 0...('B'11*60466176)
>> >> > +('F'15*1679616)+('K'20*46656)+('5'5*1296)+('T'29*36)+('2'2)
>> >> >
>> >> > Beginning of time for this count is 12/31/69 04:00:00 PM...if you
>> >> do the
>> >> > calcs above you get 691262822...if you add this many seconds to the
>> >> > beginning time you get 11/27/91 9:27:02 AM...
>> >> >
>> >> > Which validates in the system.  The guy I talked to that help
>> >> create it over
>> >> > 12 years ago...said he remembered something about haveing to 'shift
>> >> a bit or
>> >> > 2'...but I didn't get much more from him...he just didn't 
>> remember the
>> >> > specifics.  The 1st and 2nd positions I am having issues with...if
>> >> I try to
>> >> > calculate it out...I get crazy results...and also in the validation
>> >> > tool...with the above example it validated...but if I added a
>> >> > letter(00bfk5t2 changed to 0bbfk5t2)...just added value in second
>> >> > position...it would not accept it as valid???  This is probably
>> >> what he was
>> >> > talking about"Shifting a bit or 2".
>> >> >
>> >> > Anyway...any thoughts?
>> >> >
>> >> > What info would your cousin need?
>> >> >
>> >> > Thanks,
>> >> >
>> >> > Mark A. Matte
>> >> >
>> >> >
>> >
>>
>> -- 
>> Marty Connelly
>> Victoria, B.C.
>> Canada
>

-- 
Marty Connelly
Victoria, B.C.
Canada




More information about the AccessD mailing list