字串生成偽唯一十六進位制整數
最近對接了讓人頭疼的廣告EXCHANGE,需要為每個廣告設定一個全域性唯一的十六進位制ID。初步設計是講2個UDID(BIGINT20)拼接起來,但這樣遇到2個問題:
唯一性:2個UDID都是資料庫自增主鍵,型別為BIGINT20,拼接會導致非唯一性
溢位:對方使用long型別接受ID,會導致溢位
因此,要對拼接後的字串做特殊處理,處理的大致方向是保證唯一性以及縮短字串長度,大致方法是先做MD5,然後對拼接字串做雜湊:
public static long generateUUID(String id){
//MD5 id
MessageDigest md5 = null ;
try {
md5 = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
//AdContentId + schemaId 做MD5
byte[] bytes = md5.digest(id.toString().getBytes());
StringBuffer sb = new StringBuffer();
for (byte b : bytes){
//縮短字串長度:對每一位取後4位,做16進位制處理
int val = (int)b & 0xf;
sb.append(Integer.toHexString(val));
}
//Hash String to Long
return SDBMHash(sb.toString().toCharArray());
}
private static long SDBMHash(char[] str)
{
long hash = 0L;
for(char c : str)
hash = (c) + (hash << 6) + (hash << 16) - hash;
return (hash & Long.MAX_VALUE);
}
相關推薦
字串生成偽唯一十六進位制整數
最近對接了讓人頭疼的廣告EXCHANGE,需要為每個廣告設定一個全域性唯一的十六進位制ID。初步設計是講2個UDID(BIGINT20)拼接起來,但這樣遇到2個問題: 唯一性:2個UDID都是資料庫自增主鍵,型別為BIGINT20,拼接會導致非唯一性 溢位:
二進位制字串,十進位制,十六進位制字串,ASC/GBK字串間的相互轉換函式
最近在做一些**演算法的處理,由於借鑑了許多已存在模組,處理時使用了許多字串和進位制轉換函式,過程中從下面幾個函式中得到許多幫助。 論壇參考連結: https://bbs.csdn.net/topics/390991981 十進位制整數轉二進位制串 十進位制整數
十進位制數(字串)轉換為十六進位制數
緣由:程式中需要輸入十六進位制數再儲存資料傳送到下位機中。但我們在上位機中輸入的其實是一串字元。我上一位同事直接用的是強轉,數值不超過10還好,基本就是下位機配合上位機,但我又覺得這樣的做法不好,寫了一段函式用來將“字串”儲存為十六進位制數。在這裡就記錄一下,為我剛開始的事
求教:char型字串轉換為十六進位制整數問題
我有一個字串:char a[9]="1234567a"; 需要通過c++庫函式(自己會寫,但是程式碼量大)把它轉換為long或者int型,儲存在一個變數中。 =============================== char a[9]="1234567a"; long
QT QString 十六進位制整數變為字串自動補0 && 十進位制補零
QString str = QString("%1").arg(outChar&0xFF,2,16,QLatin1Char('0'));int a=0001;QString str = QString("%1").arg(a,4,10,QLatin1Char('0')
c++ j將十進位制整數轉化為十六進位制整數 用棧來實現
這是將十進位制整數轉化為十六進位制整數 並且是用棧來實現的轉化過程// 例1.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include<iost
Java生成十六進位制的MD5加密字串
package com.zzj; import java.math.BigInteger; import java.security.MessageDigest; public class MD
QT十進位制十六進位制字串轉換
QByteArray在串列埠通訊中經常被使用,有一定必要較為全面詳細的對QByteArray進行闡述。本文通過以下幾個部分加以介紹: 1. 初始化 2. 訪問與賦值 3. 新增、刪除、插入與替換操作 4. 查詢與比較 5. 資料轉換與處理 1 初始化 2 訪問與賦值
iOS 十六進位制字串 "#FFFF00" 轉換成顏色物件
1 + (UIColor *)colorWithHexStr:(NSString *)hexString { 2 NSString *colorString = [[hexString stringByReplacingOccurrencesOfString:@"#" withString:
C--十六進位制整形和字串的相互轉換
前言 十六進位制整形:6B746d656d6f7869616667650007e26B 十進位制字串:“ktiemoxiaoge ‘\07’ '\226’k" 十六進位制字串“6B746d656d6f7869616667650007e26B” 有什麼用呢??在網路通訊中,常常要制定一定的
nodejs十六進位制字串與btye型資料相互轉換
byte型轉換十六進位制字串 /** * byte型轉換十六進位制 * @param b * @returns {string} * @constructor */ const Bytes2HexString = (b)=> { let hexs = ""; fo
位元組陣列轉化為十六進位制字串時 &0xff
我是資源的搬運工~~~ 關於這個位元組陣列轉化為十六進位制字串時 &0xff,看到很多次了,這裡整理一下網上的資料,記錄一下: byte 為什麼要&0xff byte 為什麼要 &0xff /** * 位元組陣列轉換成字串HEX表示 *
整數轉字串(十進位制/十六進位制)
程式碼來自:陳碩muduo庫 #include <stdio.h> #include <algorithm> #include <stdint.h> const char digits[] = "9876543210123456789";
位元組陣列轉化為十六進位制字串時 &0xff
我是資源的搬運工~~~ 關於這個位元組陣列轉化為十六進位制字串時 &0xff,看到很多次了,這裡整理一下網上的資料,記錄一下: /** * 位元組陣列轉換成字串HEX表示 * * @param data 位元組陣列
遇到問題---redis命令列檢視中文亂碼--十六進位制字串處理
症狀 Redis在使用命令列操作時,如果檢視內容或者key中包含中文,會顯示16進位制的字串”\xe4\xb8\xad\xe5\x9b\xbd” 127.0.0.1:6379> set k1 '中國' OK 127.0.0.1:6379> get
C++中字串拼接、十六進位制轉十進位制
txt檔案如下: 檔案說明:檔案中為十六進位制資料。 實現:先進行字串拼接,然後進行十六進位制轉十進位制。 字串拼接程式碼: //字串拼接 infile>>string1>>string2; string1=string1+string2
學校OJ題——字串(十六進位制)
問題 D: 十六進位制加 時間限制: 1 Sec 記憶體限制: 128 MB 提交: 486 解決: 231 [提交][狀態][討論版] 題目描述 在十六進位制表示中,ABCDEF用於表示十進位制的10、11、12、13、14、15 現輸入兩個表示十六進位制整數的字串,請計算它們相加的結
串列埠傳送字串和十六進位制原始碼
/** * @brief USART GPIO 配置,工作引數配置 * @param 無 * @retval 無 */ void USART_Config(void) { GPIO_InitTypeDef GPIO_InitStructure;
檔案資料轉十六進位制數生成陣列
#include <stdio.h> #include <string.h> /* * feof():當設定了與流關聯的檔案結束識別符號時,該函式返回一個非零值,否則返回零
android byte位元組陣列轉換十六進位制字串(物聯網開發總結)
想起前段時間的物聯網的外包開發,經常遇到通過wifi接受的資料,要通過轉換成十六進位制字串,或者最後又是十進位制資料。都是根據雙方的協議來開發的。那麼我傳送過去的資料也需要,經過特殊轉換成byte位元組發過去,硬體那邊收到不至於亂碼的資料。 1、硬體除錯發給android這