csharp/rocketmq-client-csharp/Utilities.cs (130 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System.Linq; using System.Net.NetworkInformation; using System.Text; using System; using System.Diagnostics; using System.IO; using System.IO.Compression; using System.Security.Cryptography; using System.Threading; namespace Org.Apache.Rocketmq { public static class Utilities { private static long _instanceSequence = 0; private static readonly int ProcessId = Process.GetCurrentProcess().Id; private static readonly string HostName = System.Net.Dns.GetHostName(); private static readonly byte[] RandomMacAddressBytes = Enumerable.Range(0, 6).Select(_ => (byte)new Random().Next(256)).ToArray(); public const int MasterBrokerId = 0; public static int GetPositiveMod(int k, int n) { var result = k % n; return result < 0 ? result + n : result; } public static byte[] GetMacAddress() { var nics = NetworkInterface.GetAllNetworkInterfaces().Where( x => x.NetworkInterfaceType != NetworkInterfaceType.Loopback && (int)x.NetworkInterfaceType != 53); var nic = nics.FirstOrDefault(x => x.OperationalStatus == OperationalStatus.Up) ?? nics.FirstOrDefault(x => x.OperationalStatus == OperationalStatus.Unknown) ?? nics.FirstOrDefault(); if (nic == null) { return RandomMacAddressBytes; } var mac = nic.GetPhysicalAddress().GetAddressBytes(); return mac.Length < 6 ? mac : RandomMacAddressBytes; } public static int GetProcessId() { return ProcessId; } public static string GetHostName() { return HostName; } public static string GetClientId() { var hostName = System.Net.Dns.GetHostName(); var pid = Process.GetCurrentProcess().Id; var index = Interlocked.Increment(ref _instanceSequence); var nowMillisecond = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalMilliseconds; var no = DecimalToBase36(nowMillisecond); return $"{hostName}@{pid}@{index}@{no}"; } #if NET5_0_OR_GREATER public static string ComputeMd5Hash(byte[] data) { var hashBytes = MD5.HashData(data); return Convert.ToHexString(hashBytes); } public static string ComputeSha1Hash(byte[] data) { var hashBytes = SHA1.HashData(data); return Convert.ToHexString(hashBytes); } public static string ByteArrayToHexString(byte[] bytes) { return Convert.ToHexString(bytes); } #else private static readonly ThreadLocal<MD5> Md5 = new ThreadLocal<MD5>(MD5.Create); private static readonly ThreadLocal<SHA1> Sha1 = new ThreadLocal<SHA1>(SHA1.Create); public static string ComputeMd5Hash(byte[] data) { var hashBytes = Md5.Value.ComputeHash(data); return BitConverter.ToString(hashBytes).Replace("-", ""); } public static string ComputeSha1Hash(byte[] data) { var hashBytes = Sha1.Value.ComputeHash(data); return BitConverter.ToString(hashBytes).Replace("-", ""); } public static string ByteArrayToHexString(byte[] bytes) { return BitConverter.ToString(bytes).Replace("-", ""); } #endif private static string DecimalToBase36(long decimalNumber) { const string chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; string result = string.Empty; while (decimalNumber > 0) { result = chars[(int)(decimalNumber % 36)] + result; decimalNumber /= 36; } return result; } public static byte[] CompressBytesGzip(byte[] src, CompressionLevel level) { using (var ms = new MemoryStream()) { using (var gzip = new GZipStream(ms, level)) { gzip.Write(src, 0, src.Length); } return ms.ToArray(); } } public static byte[] DecompressBytesGzip(byte[] src) { var inputStream = new MemoryStream(src); using var gzipStream = new GZipStream(inputStream, CompressionMode.Decompress); using var outputStream = new MemoryStream(); gzipStream.CopyTo(outputStream); return outputStream.ToArray(); } public static byte[] DecompressBytesZlib(byte[] src) { if (src == null || src.Length == 0) { throw new ArgumentException("Input cannot be null or empty.", nameof(src)); } using var inputStream = new MemoryStream(src); using var zLibStream = new ZLibStream(inputStream, CompressionMode.Decompress); using var outputStream = new MemoryStream(); zLibStream.CopyTo(outputStream); return outputStream.ToArray(); } } }