Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SHA256 Hashing Function in Stata?

    Hi,

    is there a simple subroutine that would allow to get the output of the SHA256 of a variable in Stata? Thanks.

  • #2
    You may modify the following:
    Code:
    sysuse auto , clear
    keep make
    gen str64 SHA256 = ""
    
    java:
    
    import com.stata.sfi.*;
    
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.nio.charset.StandardCharsets;
    import java.math.BigInteger;
    
    MessageDigest md = MessageDigest.getInstance("SHA-256");
    
    String VarName = "make"; 
    String VarNameSHA256 = "SHA256"; 
    
    Integer orgstrvar = Data.getVarIndex(VarName);
    Integer newstrvar = Data.getVarIndex(VarNameSHA256)
     
    for (long n = 1;  n <= Data.getObsTotal(); n++) {
    
        String text = Data.getStr​(orgstrvar,n);
                
        md.update(text.getBytes(StandardCharsets.UTF_8));
        byte[] digest = md.digest();
        
        System.out.println(String.format("%064x", new BigInteger(1, digest))); 
        Data.storeStrf​(newstrvar, n, String.format("%064x", new BigInteger(1, digest)));
    }    
     
    end
    Code:
    . list in 1/5
    
         +----------------------------------------------------------------------------------+
         | make                                                                      SHA256 |
         |----------------------------------------------------------------------------------|
      1. | AMC Concord     43a42426f1ef0ff3852283ee136b6c6175d38187938cea5464853a0362d4a00c |
      2. | AMC Pacer       75e3c7fd9a49b153a270cf8afe6df395c5171775f5dbd642dceefe5b2689eb6f |
      3. | AMC Spirit      b8c9a35beea6d0fdf238947ec5a4c7c063a540d6916a731e76bd2f5c5251c76b |
      4. | Buick Century   1996df3009e4df9a2ed780572723a5d985971961015f980a3186b8cc2081dae9 |
      5. | Buick Electra   b0403019f9f9016e2b008e24bb094563e116b85e081c445c831c9c0f60097b96 |
         +----------------------------------------------------------------------------------+
    Last edited by Bjarte Aagnes; 12 May 2022, 12:26.

    Comment


    • #3
      Thanks a lot Bjarte, it helps!

      Comment


      • #4
        If you're using a Unix-based OS (macOS or Linux) you can achieve this using my shell wrapper inshell (available on the SSC) like so:

        Code:
        sysuse auto, clear
        gen str64 SHA256 = ""
        local var make                  // set your variable here
        forvalues i = 1 / `c(N)' {
          inshell echo -n `=`var'[`i']' | shasum -a 256 | tr -d ' -'
          replace SHA256 = r(no1) in `i'
        }
        Code:
        . list make SHA256 in 1/5
        
             +----------------------------------------------------------------------------------+
             | make                                                                      SHA256 |
             |----------------------------------------------------------------------------------|
          1. | AMC Concord     43a42426f1ef0ff3852283ee136b6c6175d38187938cea5464853a0362d4a00c |
          2. | AMC Pacer       75e3c7fd9a49b153a270cf8afe6df395c5171775f5dbd642dceefe5b2689eb6f |
          3. | AMC Spirit      b8c9a35beea6d0fdf238947ec5a4c7c063a540d6916a731e76bd2f5c5251c76b |
          4. | Buick Century   1996df3009e4df9a2ed780572723a5d985971961015f980a3186b8cc2081dae9 |
          5. | Buick Electra   b0403019f9f9016e2b008e24bb094563e116b85e081c445c831c9c0f60097b96 |
             +----------------------------------------------------------------------------------+
        Note that you must use the -n flag with echo to remove the trailing new line.

        Comment

        Working...
        X